{"cells":[{"cell_type":"markdown","metadata":{"id":"UCf3rLtxd55M"},"source":["## 0. Set up the environment"]},{"cell_type":"code","execution_count":237,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":2242,"status":"ok","timestamp":1662210151466,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"zYjZ2ae-TGug","outputId":"e0b61965-d3cb-4580-d997-5dc521e07ac3"},"outputs":[{"name":"stdout","output_type":"stream","text":["Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"]}],"source":["from google.colab import drive\n","drive.mount('/content/drive')"]},{"cell_type":"code","execution_count":238,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":402,"status":"ok","timestamp":1662210151861,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"YZWRNPeVq6uP","outputId":"595547ad-afad-4b3b-cd6b-76a94c1000ad"},"outputs":[{"name":"stdout","output_type":"stream","text":["Sat Sep  3 13:02:31 2022       \n","+-----------------------------------------------------------------------------+\n","| NVIDIA-SMI 460.32.03    Driver Version: 460.32.03    CUDA Version: 11.2     |\n","|-------------------------------+----------------------+----------------------+\n","| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |\n","| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |\n","|                               |                      |               MIG M. |\n","|===============================+======================+======================|\n","|   0  Tesla P100-PCIE...  Off  | 00000000:00:04.0 Off |                    0 |\n","| N/A   43C    P0    34W / 250W |   2873MiB / 16280MiB |      0%      Default |\n","|                               |                      |                  N/A |\n","+-------------------------------+----------------------+----------------------+\n","                                                                               \n","+-----------------------------------------------------------------------------+\n","| Processes:                                                                  |\n","|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |\n","|        ID   ID                                                   Usage      |\n","|=============================================================================|\n","+-----------------------------------------------------------------------------+\n"]}],"source":["gpu_info = !nvidia-smi\n","gpu_info = '\\n'.join(gpu_info)\n","if gpu_info.find('failed') >= 0:\n","  print('Not connected to a GPU')\n","else:\n","  print(gpu_info)"]},{"cell_type":"code","execution_count":239,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":12,"status":"ok","timestamp":1662210151862,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"xUqZXCopq9fG","outputId":"2a2e1476-61e4-4427-a1d2-a0f519140ab7"},"outputs":[{"name":"stdout","output_type":"stream","text":["Your runtime has 27.3 gigabytes of available RAM\n","\n","You are using a high-RAM runtime!\n"]}],"source":["from psutil import virtual_memory\n","ram_gb = virtual_memory().total / 1e9\n","print('Your runtime has {:.1f} gigabytes of available RAM\\n'.format(ram_gb))\n","\n","if ram_gb < 20:\n","  print('Not using a high-RAM runtime')\n","else:\n","  print('You are using a high-RAM runtime!')"]},{"cell_type":"code","execution_count":240,"metadata":{"executionInfo":{"elapsed":11,"status":"ok","timestamp":1662210151862,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"Dg5dBjDQSUZ_"},"outputs":[],"source":["import os\n","import numpy as np\n","import os\n","import sys\n","import joblib\n","import pandas as pd\n","import matplotlib.pyplot as plt\n","import seaborn as sns\n","import tarfile\n","import math\n","import random\n","import statistics as stats\n","import scipy\n","import sklearn\n","from scipy.io import loadmat\n","from scipy import signal\n","from progressbar import ProgressBar\n","from scipy.signal import butter, lfilter, filtfilt"]},{"cell_type":"code","execution_count":241,"metadata":{"executionInfo":{"elapsed":10,"status":"ok","timestamp":1662210151862,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"elI3CyFtSinG"},"outputs":[],"source":["import tensorflow as tf\n","from tensorflow import keras\n","\n","from keras import layers, Sequential\n","from keras.layers import Input, Add, Dense, Activation, ZeroPadding1D, Flatten, Conv1D, MaxPooling1D, GlobalMaxPooling1D, Dropout, BatchNormalization, concatenate\n","from keras.models import Model, load_model\n","from keras import callbacks\n","from keras_preprocessing.sequence import pad_sequences\n","\n","import keras.backend as K\n","K.set_image_data_format('channels_last')"]},{"cell_type":"code","execution_count":242,"metadata":{"executionInfo":{"elapsed":11,"status":"ok","timestamp":1662210151863,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"iljQW3PggBm8"},"outputs":[],"source":["SEED = 4224\n","np.random.seed(SEED)\n","random.seed(SEED)\n","os.environ['PYTHONHASHSEED'] = str(SEED)"]},{"cell_type":"code","execution_count":243,"metadata":{"executionInfo":{"elapsed":10,"status":"ok","timestamp":1662210151863,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"qcE70NRNzgRt"},"outputs":[],"source":["# Utility functions\n","def empty_list(n, fill_default = 0):\n","    ll = [fill_default] * n\n","    return ll"]},{"cell_type":"markdown","metadata":{"id":"OqiM2sYDTHRu"},"source":["## 1. Load data"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":5438,"status":"ok","timestamp":1662210157291,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"uytssTDOSb0F","outputId":"5af6919f-3612-426b-847e-80923ca76b35"},"outputs":[],"source":["# Unzip the file containing training data\n","!unzip \"/content/drive/MyDrive/AI_IN_BIOMEDICINE/PROJECT/training_set.zip\""]},{"cell_type":"code","execution_count":245,"metadata":{"executionInfo":{"elapsed":16,"status":"ok","timestamp":1662210157291,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"AdqyL4_8VoGv"},"outputs":[],"source":["input_directory = '/content/training_set'"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":17,"status":"ok","timestamp":1662210157292,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"YW605QZhTG4j","outputId":"d78b1e4a-9b82-4335-f124-27d238607d80"},"outputs":[],"source":["# N.B. Sort the file names in alphanumerical order to have perfect \n","# correspomdence btw signals, rpeak pos and labels\n","filenames = []\n","for f in os.listdir(input_directory):\n","  filenames.append(f)\n","\n","filenames = sorted(filenames)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":11,"status":"ok","timestamp":1662210157292,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"jow_D1bX8-7q","outputId":"b2868e1f-77d9-4a23-b1cc-a9b3aff555c4"},"outputs":[],"source":["# Create an array containing the IDs of the subjects \n","# n.b. This might be useful when ECG signal will be split into single heartbeats\n","subjects = []\n","for f in filenames:\n","  if \"ann\" not in f.lower() and \"rpk\" not in f.lower():\n","    subjects.append(f[0:4])\n","\n","num_subjects = len(subjects)\n","print(subjects)"]},{"cell_type":"code","execution_count":248,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":2308,"status":"ok","timestamp":1662210159593,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"oJy-AwQJWhXS","outputId":"1d0e4672-02fc-449f-cea3-ed45092fd1f2"},"outputs":[{"name":"stdout","output_type":"stream","text":["Loading data...\n"]}],"source":["print('Loading data...')\n","\n","# N.B. We have 3 different types of files:\n","# - ECG data\n","# - Annotations of R-peaks ('ann')\n","# - R-peaks positions ('rpk')\n","# We want to load these files in 3 different data structures (list of objects)\n","recordings = []\n","rpeaks = []\n","labels = []\n","# N.B. One object for each subject\n","\n","# Scan through all the data in the input directory. Depending on the name of the \n","# file choose the right list to store the data in the 3 data structures\n","for f in filenames:\n","  # Get the path for the current file\n","  g = os.path.join(input_directory, f)\n","  if 'ann' in f.lower() and os.path.isfile(g):\n","    label = loadmat(g)\n","    label = np.asarray(label['labels'])\n","    labels.append(label)\n","  elif 'rpk' in f.lower() and os.path.isfile(g):\n","    rpeak = loadmat(g)\n","    rpeak = np.asarray(rpeak['rpeaks'])\n","    rpeaks.append(rpeak)\n","  else:\n","    record = loadmat(g)\n","    record = np.asarray(record['ecg'])\n","    recordings.append(record)\n","\n","num_records = len(recordings)\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":6,"status":"ok","timestamp":1662210159594,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"9M33AbgL7_Zi","outputId":"0cccf0c3-621c-4189-8af6-b5ccb79952ee"},"outputs":[],"source":["# Create a mask containing the sampling frequencies\n","# n.b. each ECG signal is measured over a time of 1800s\n","freqs = []\n","for rec in recordings:\n","  freqs.append(int(len(rec)/1800)) \n","\n","# Associate frequncies to subjects\n","subj_freqs = dict(zip(subjects, freqs))\n","print(subj_freqs)"]},{"cell_type":"code","execution_count":250,"metadata":{"executionInfo":{"elapsed":5,"status":"ok","timestamp":1662210159595,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"fyzFJRmXHD87"},"outputs":[],"source":["# Tranform shape of rpeaks elements from (n,1) to (n,)\n","for i, elem in enumerate(rpeaks):\n","  rpeaks[i] = elem.reshape((len(elem),))"]},{"cell_type":"markdown","metadata":{"id":"-lkisEgjrlVu"},"source":["## 2. Labels encoding\n","- **0** for **'N'**: *normal sinus rhythm*\n","- **1** for **'S'**: *supraventricular beats* (**PACs**)\n","- **2** for **'V'**: *ventricular beats* (mostly **PVCs**)"]},{"cell_type":"code","execution_count":232,"metadata":{"executionInfo":{"elapsed":6,"status":"ok","timestamp":1662210128532,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"Duh_m8LXWhaw"},"outputs":[],"source":["num_classes = 3\n","classes_names = [\"NSR\", \"PAC\", \"PVC\"]\n","binary_labels = []\n","\n","# Loop across the subjects\n","for i, subj_labels in enumerate(labels):\n","  # Initialize data structure to store the labels for each subject\n","  binary_labels.append(np.zeros(len(subj_labels), dtype=np.int32))\n","  # Loop across the beats for a subject\n","  for j, single_label in enumerate(subj_labels):\n","    if single_label == \"N\":\n","      binary_labels[i][j] = 0\n","    elif single_label == \"S\":\n","      binary_labels[i][j] = 1\n","    elif single_label == \"V\":\n","      binary_labels[i][j] = 2"]},{"cell_type":"markdown","metadata":{"id":"ValeMADyDhzf"},"source":["## 3. Extract **Heartbeats** & Features about **R-R Intervals**\n","Consider an ECG signal and the correspondent R-peak positions.\n","Compute all the **middle points** between one peak and the following one. Each heartbeat is computed as the signal delimited by 2 consecutive middle points.\n","\n","To extract RR features:\n","Following Sannino, De Pietro, we want to compute the following features:\n","- the **Pre-RR interval**, defined as the RR-interval between a\n","given heartbeat and the previous heartbeat;\n","- the **Post-RR interval**, defined as the RR-interval between a\n","given heartbeat and the following heartbeat;\n","- the **Local average RR interval**, defined as the average of the\n","10 RR-intervals within a sliding window covering the past\n","10 s;\n","- the **Global average RR interval**, defined as the average of\n","the 10 RR-intervals within a sliding window covering the\n","previous 5 min;"]},{"cell_type":"code","execution_count":251,"metadata":{"executionInfo":{"elapsed":6,"status":"ok","timestamp":1662210160839,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"TjaRBxNPg3QW"},"outputs":[],"source":["# Create the class heartbeat to store all the info for an heartbeat\n","class HeartBeat:\n","  ''' Remark:\n","  - Rpeak: position of the Rpeak of the current beat relative to the whole ECG signal\n","  - original_pos: position of the heartbeat in the original sequence, before any\n","                  deletion. It allows to reconstruct the ECG signal concatenating\n","                  the beats according the original order.\n","                  Same value for the same beat in the 2 leads. \n","  ''' \n","  # Constructor\n","  def __init__(self, subjectID, Rpeak, label, lead, frequency, original_pos, \n","               pre_RR, post_RR, local_RR, global_RR, signal=None, aug=False):\n","    self.subjectID = subjectID\n","    self.Rpeak = Rpeak \n","    self.label = label\n","    self.lead = lead\n","    self.frequency = frequency\n","    self.original_pos = original_pos\n","    self.pre_RR = pre_RR\n","    self.post_RR = post_RR\n","    self.local_RR = local_RR\n","    self.global_RR = global_RR\n","    self.aug = aug\n","    if signal is None:\n","      self.signal = []\n","    else:  \n","      self.signal = signal\n","\n","  # Print method\n","  def __str__(self):\n","    return f'''HeartBeat({self.subjectID}, {self.frequency}, {self.Rpeak}, \n","                         {self.label}, {self.lead}, {self.original_pos}, \n","                         {self.pre_RR}, {self.post_RR}, {self.local_RR}, \n","                         {self.global_RR}, {self.aug}, {self.signal})'''"]},{"cell_type":"code","execution_count":252,"metadata":{"executionInfo":{"elapsed":6,"status":"ok","timestamp":1662210160840,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"pIiEesOOZayr"},"outputs":[],"source":["def extract_RR_features(rpeaks, freq, local_win_seconds = 10, \n","                        global_win_minutes = 5):\n","  pre_RR = []\n","  post_RR = []\n","  local_RR = []\n","  global_RR = []\n","  local_win = []\n","  global_win = []\n","  local_win_time = local_win_seconds*freq\n","  global_win_time = global_win_minutes*60*freq\n","\n","  for i in range(len(rpeaks)):\n","    # PRE_RR\n","    if i-1 >= 0:\n","      pre_RR.append(rpeaks[i] - rpeaks[i-1])\n","    else:\n","      pre_RR.append(np.nan)\n","\n","    # POST_RR\n","    if i+1 < len(rpeaks):\n","      post_RR.append(rpeaks[i+1] - rpeaks[i])\n","    else:\n","      post_RR.append(np.nan)\n","\n","    # LOCAL_RR\n","    # Append in the back  \n","    local_win.append(np.where(np.isnan(pre_RR[i]), 0, pre_RR[i]))\n","    # Compute time spanned by the window\n","    local_time_span = sum(local_win)\n","    if local_time_span < local_win_time: # window is not full\n","      # average is nan\n","      local_RR.append(np.nan)\n","    elif local_time_span >= local_win_time:\n","      while local_time_span >= local_win_time:\n","        # Pop element in the front\n","        del local_win[0]\n","        # Recompute time_span\n","        local_time_span = local_win[-1] - local_win[0]\n","      # Compute the average\n","      local_RR.append(sum(local_win)/len(local_win))\n","      \n","    # GLOBAL_RR\n","    # Append in the back\n","    global_win.append(np.where(np.isnan(pre_RR[i]), 0, pre_RR[i]))\n","    # Compute time spanned by the window\n","    global_time_span = sum(global_win)\n","    if global_time_span < global_win_time: # window is not full\n","      # average is nan\n","      global_RR.append(np.nan)\n","    elif global_time_span >= global_win_time:\n","      while global_time_span >= global_win_time:\n","        # Pop element in the front\n","        del global_win[0]\n","        # Recompute time_span\n","        global_time_span = global_win[-1] - global_win[0]\n","      # Compute the average\n","      global_RR.append(sum(global_win)/len(global_win))\n","  \n","  return pre_RR, post_RR, local_RR, global_RR"]},{"cell_type":"code","execution_count":253,"metadata":{"executionInfo":{"elapsed":5,"status":"ok","timestamp":1662210160840,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"5tkd7Ot2g3QY"},"outputs":[],"source":["def get_midpoints(rpeaks):\n","  '''Returns vector of midpoints between a couple of R-peaks'''\n","  dists = np.diff(rpeaks)\n","  midpoints = np.add(rpeaks[:-1], dists/2).astype(int)\n","  # Add a 0 at the beginning \n","  midpoints = np.insert(midpoints, 0, 0)\n","  return midpoints\n","\n","def get_subject_hbeats(signal, rpeaks, labels, subj_ID, freq):\n","  \n","  ''' Function to extract the heartbeats from a subject's data\n","  n.b. 1st and 2nd lead signals are separated into two different lists'''\n","  \n","  # Compute array of midpoints\n","  midpoints = get_midpoints(rpeaks)\n","\n","  # Append final point of the signal at the end\n","  midpoints = np.append(midpoints, len(signal))\n","\n","  # Extract the RR features for the subject\n","  pre_RR, post_RR, local_RR, global_RR = extract_RR_features(rpeaks, freq)\n","\n","  # Iterate over the midpoints array to split the signal into heartbeats\n","  heartbeats_lead1 = [] # list of 'HeartBeat' objects\n","  heartbeats_lead2 = [] # list of 'HeartBeat' objects\n","  for i in range(len(rpeaks)):\n","    # Extract the 2 leads separately\n","    for l, signal_lead in enumerate(np.rollaxis(signal, 1)):\n","      # Define an heartbeat according to the midpoints\n","      curr_beat = signal_lead[midpoints[i]:midpoints[i+1]]\n","  \n","      # Store all the info in an object of class \"heartbeat\"\n","      curr_hbeat = HeartBeat(subjectID=subj_ID, signal=curr_beat, frequency=freq,\n","                             Rpeak=rpeaks[i], label=labels[i], lead=l+1,\n","                             pre_RR=pre_RR[i], post_RR=post_RR[i],\n","                             local_RR=local_RR[i], global_RR=global_RR[i],\n","                             original_pos=i)\n","      if l == 0: #1st lead\n","        heartbeats_lead1.append(curr_hbeat)\n","      elif l == 1: #2nd lead\n","        heartbeats_lead2.append(curr_hbeat)\n","\n","  # # Get rid of 1st and last heartbeats (both the leads!)\n","  # heartbeats = heartbeats[2:-2]\n","  \n","  return heartbeats_lead1, heartbeats_lead2"]},{"cell_type":"markdown","metadata":{"id":"ulMbjRmtvswW"},"source":["Extract heartbeats for the **entire population** of subjects:"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":26214,"status":"ok","timestamp":1662210187049,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"SemV5ZQmg3Qa","outputId":"59be5d6c-f8c0-421c-f59d-97a454fcf13b"},"outputs":[],"source":["# Iterate the heartbeat extraction over all the subjects (and both the leads)\n","pbar = ProgressBar()\n","heartbeats_lead1 = []\n","heartbeats_lead2 = []\n","for i, (subj,freq) in pbar(enumerate(subj_freqs.items())):\n","  curr_hbeats_lead1, curr_hbeats_lead2 = get_subject_hbeats(recordings[i], \n","                                                            rpeaks[i], \n","                                                            binary_labels[i], \n","                                                            subj, \n","                                                            freq)\n","  heartbeats_lead1.extend(curr_hbeats_lead1)\n","  heartbeats_lead2.extend(curr_hbeats_lead2)"]},{"cell_type":"markdown","metadata":{"id":"8sQBwfvVB5EE"},"source":["### 3.1. **Delete heartbeats** whose length is out of physiologically plausible **limits**\n","**Limits:** Human BPM at rest are between 40 and 120 (considering a very large spectrum).\n","This implies that the length of an heartbeat should be roughly comprised between:\n","- At 128Hz: [0.5x128; 1.5x128] = [64; 192]\n","- At 250Hz: [0.5x250; 1.5x250] = [125; 375]\n","\n","However, due to PAC we could have beats which are close each other. Therefore we **only consider the upper limit** for length."]},{"cell_type":"markdown","metadata":{"id":"S_MtQlReKcts"},"source":["Since we have lots of data, we can simply **remove** these istances."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":14,"status":"ok","timestamp":1662210187050,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"lTbfaxnDN_Q1","outputId":"00003020-9fd6-4bb1-ff97-15b0443e04b7"},"outputs":[],"source":["# Find all the istances which are out of the physiological range\n","# N.B. We have to differentiate signals based on the sampling frequency!\n","out_of_range_idxs = []\n","for i,hb in enumerate(heartbeats_lead1):\n","  if hb.frequency == 128 and len(hb.signal) >= 192:\n","    out_of_range_idxs.append(i)\n","  elif hb.frequency == 250 and len(hb.signal) >= 375:\n","    out_of_range_idxs.append(i)\n","out_of_range_idxs = pd.Series(out_of_range_idxs)\n","print(out_of_range_idxs)\n","\n","# Remove elements\n","# LEAD 1\n","print(\"Lead 1:\")\n","print(len(heartbeats_lead1))\n","print(len(heartbeats_lead1) - len(out_of_range_idxs))\n","for idx in sorted(out_of_range_idxs, reverse=True):\n","  del heartbeats_lead1[idx]\n","print(len(heartbeats_lead1))\n","\n","# LEAD 2\n","print(\"Lead 2:\")\n","print(len(heartbeats_lead2))\n","print(len(heartbeats_lead2) - len(out_of_range_idxs))\n","for idx in sorted(out_of_range_idxs, reverse=True):\n","  del heartbeats_lead2[idx]"]},{"cell_type":"markdown","metadata":{"id":"e7hOK914iH6M"},"source":["### 3.2. Remove heartbeats whose RR features are **'Nan'**\n","N.B. Since we are taking the average across windows of 5 min of beats, we are going to remove the first 5 minutes of every ECG signal."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":2458,"status":"ok","timestamp":1662210189497,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"e_IfZ52iiHO8","outputId":"bdd7282a-2f6b-458e-a1a5-54f6adea3039"},"outputs":[],"source":["nan_idxs = []\n","for i,hb in enumerate(heartbeats_lead1):\n","  if np.isnan(hb.pre_RR) or np.isnan(hb.post_RR) or np.isnan(hb.local_RR) or np.isnan(hb.global_RR):\n","    nan_idxs.append(i)\n","nan_idxs = pd.Series(nan_idxs)\n","print(nan_idxs)\n","\n","# Remove elements\n","# LEAD 1\n","print(\"Lead 1:\")\n","print(len(heartbeats_lead1))\n","print(len(heartbeats_lead1) - len(nan_idxs))\n","for idx in sorted(nan_idxs, reverse=True):\n","  del heartbeats_lead1[idx]\n","print(len(heartbeats_lead1))\n","\n","# LEAD 2\n","print(\"Lead 2:\")\n","print(len(heartbeats_lead2))\n","print(len(heartbeats_lead2) - len(nan_idxs))\n","for idx in sorted(nan_idxs, reverse=True):\n","  del heartbeats_lead2[idx]"]},{"cell_type":"markdown","metadata":{"id":"s__8zWx0fHOc"},"source":["N.B. Create a unique heartbeats vector containing the 2 leads to avoid code replication"]},{"cell_type":"code","execution_count":258,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":6,"status":"ok","timestamp":1662210189497,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"XA7C59l8fGKn","outputId":"4c0cfe43-5453-4154-db80-86daca59f9bf"},"outputs":[{"data":{"text/plain":["398450"]},"execution_count":258,"metadata":{},"output_type":"execute_result"}],"source":["heartbeats = heartbeats_lead1 + heartbeats_lead2\n","num_hbs = len(heartbeats)\n","num_hbs"]},{"cell_type":"markdown","metadata":{"id":"3dJVn_yqcl-k"},"source":["Plot for the report"]},{"cell_type":"code","execution_count":262,"metadata":{"executionInfo":{"elapsed":1079,"status":"ok","timestamp":1662210584069,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"2vUTaBvGdDLI"},"outputs":[],"source":["# One signals for each class \n","NSR_signal_lead1 = None\n","PAC_signal_lead1 = None\n","PVC_signal_lead1 = None\n","NSR_signal_lead2 = None\n","PAC_signal_lead2 = None\n","PVC_signal_lead2 = None\n","found1 = False\n","found2 = False\n","found3 = False\n","for i in range(len(heartbeats_lead1)):\n","  if heartbeats_lead1[i].label == 0 and not found1:\n","    NSR_signal_lead1 = heartbeats_lead1[i].signal\n","    NSR_signal_lead2 = heartbeats_lead2[i].signal\n","    found1 = True\n","  elif heartbeats_lead1[i].label == 1 and not found2:\n","    PAC_signal_lead1 = heartbeats_lead1[i].signal\n","    PAC_signal_lead2 = heartbeats_lead2[i].signal\n","    found2 = True\n","  elif heartbeats_lead1[i].label == 2 and not found3:\n","    PVC_signal_lead1 = heartbeats_lead1[i].signal\n","    PVC_signal_lead2 = heartbeats_lead2[i].signal\n","    found3 = True"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"MMzqYwvmcl-k"},"outputs":[],"source":["fig = plt.figure(figsize=(5,4))\n","t = np.arange(len(NSR_signal_lead1))\n","plt.plot(t, NSR_signal_lead1, color=\"C0\")\n","plt.xlabel('True labels', fontsize=16)\n","plt.ylabel('Predicted labels', fontsize=16)\n","plt.title('NSR heartbeat - Lead 1', fontsize=20)\n","plt.show()\n","\n","fig = plt.figure(figsize=(5,4))\n","t = np.arange(len(NSR_signal_lead2))\n","plt.plot(t, NSR_signal_lead2, color=\"C0\")\n","plt.xlabel('True labels', fontsize=16)\n","plt.ylabel('Predicted labels', fontsize=16)\n","plt.title('NSR heartbeat - Lead 2', fontsize=20)\n","plt.show()\n","\n","fig = plt.figure(figsize=(5,4))\n","t = np.arange(len(PAC_signal_lead1))\n","plt.plot(t, PAC_signal_lead1, color=\"C1\")\n","plt.xlabel('True labels', fontsize=16)\n","plt.ylabel('Predicted labels', fontsize=16)\n","plt.title('PAC heartbeat - Lead 1', fontsize=20)\n","plt.show()\n","\n","fig = plt.figure(figsize=(5,4))\n","t = np.arange(len(PAC_signal_lead2))\n","plt.plot(t, PAC_signal_lead2, color=\"C1\")\n","plt.xlabel('True labels', fontsize=16)\n","plt.ylabel('Predicted labels', fontsize=16)\n","plt.title('PAC heartbeat - Lead 2', fontsize=20)\n","plt.show()\n","\n","fig = plt.figure(figsize=(5,4))\n","t = np.arange(len(PVC_signal_lead1))\n","plt.plot(t, PVC_signal_lead1, color=\"C2\")\n","plt.xlabel('True labels', fontsize=16)\n","plt.ylabel('Predicted labels', fontsize=16)\n","plt.title('PVC heartbeat - Lead 1', fontsize=20)\n","plt.show()\n","\n","fig = plt.figure(figsize=(5,4))\n","t = np.arange(len(PVC_signal_lead2))\n","plt.plot(t, PVC_signal_lead2, color=\"C2\")\n","plt.xlabel('True labels', fontsize=16)\n","plt.ylabel('Predicted labels', fontsize=16)\n","plt.title('PVC heartbeat - Lead 2', fontsize=20)\n","plt.show()\n"]},{"cell_type":"markdown","metadata":{"id":"5w1MwzOuC8c4"},"source":["## 4. Signal Preprocessing"]},{"cell_type":"markdown","metadata":{"id":"avypJmig680a"},"source":["### 4.1. **Standardize** ECG signals \n","**Standardize** data using the **Z-score** approach, *one heartbeat at the time*!! \n","\n","N.B. Standardization happens in Data Augmentation phase!!!"]},{"cell_type":"code","execution_count":266,"metadata":{"executionInfo":{"elapsed":313,"status":"ok","timestamp":1662211161447,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"gI8E2mft_61a"},"outputs":[],"source":["def NormalizeData(data):\n","    return (data - np.min(data)) / (np.max(data) - np.min(data))\n","\n","# Function that, given mean, sd values, performs standardization\n","def Zscore_Standardization(data, mean, sd):\n","  ''' Data: one ECG signal. '''\n","  return (data - mean) / sd"]},{"cell_type":"code","execution_count":267,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":16166,"status":"ok","timestamp":1662211177998,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"tI_GKR2deZeP","outputId":"8eaf6bd1-12b8-466c-b941-2cf58d06bfbb"},"outputs":[{"name":"stderr","output_type":"stream","text":["100% (398450 of 398450) |################| Elapsed Time: 0:00:16 Time:  0:00:16\n"]}],"source":["pbar = ProgressBar()\n","for i in pbar(range(len(heartbeats))):\n","  heartbeats[i].signal = Zscore_Standardization(heartbeats[i].signal,\n","                                                np.mean(heartbeats[i].signal),\n","                                                np.std(heartbeats[i].signal))"]},{"cell_type":"markdown","metadata":{"id":"l_VZWKvM0QSb"},"source":["### 4.2. **Heartbeats Resampling**\n","Resample all the heartbeat signals to a fixed length using FFT.\n","\n","**N.B.** Resampling is more effective if the selected length is not *too small*, otherwise some information can be lost. \n","\n","In order to have a consistent representation of the resampled signal we consider as final length a value close to the **median** heartbeat length."]},{"cell_type":"code","execution_count":268,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":18711,"status":"ok","timestamp":1662211196942,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"5WUvGBZU1XZn","outputId":"73d24b40-51bc-4955-cd52-65fe707ace52"},"outputs":[{"name":"stderr","output_type":"stream","text":["| |  #                                           | 398449 Elapsed Time: 0:00:18\n"]}],"source":["pbar = ProgressBar()\n","\n","final_len = 128\n","\n","heartbeats_res = empty_list(len(heartbeats))\n","for i, hb in pbar(enumerate(heartbeats)):\n","  signal_res = scipy.signal.resample(hb.signal, final_len)\n","  hb.signal = signal_res \n","  heartbeats_res[i] = hb\n","\n","for hb in heartbeats_res:\n","  if len(hb.signal) != final_len:\n","    print(len(hb.signal))"]},{"cell_type":"markdown","metadata":{"id":"DAHSjw96JEby"},"source":["### 4.3. **Denoise** ECG signals using **Bandpass Filter**\n","\n"]},{"cell_type":"code","execution_count":269,"metadata":{"executionInfo":{"elapsed":24,"status":"ok","timestamp":1662211196943,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"olUXAugqBum2"},"outputs":[],"source":["def bandpass_filter(data, lowcut, highcut, signal_freq, filter_order):\n","        \"\"\"\n","        Method responsible for creating and applying Butterworth filter.\n","        :param deque data: raw data\n","        :param float lowcut: filter lowcut frequency value\n","        :param float highcut: filter highcut frequency value\n","        :param int signal_freq: signal frequency in samples per second (Hz)\n","        :param int filter_order: filter order\n","        :return array: filtered data\n","        \"\"\"\n","        nyquist_freq = 0.5 * signal_freq\n","        low = lowcut / nyquist_freq\n","        high = highcut / nyquist_freq\n","        b, a = butter(filter_order, [low, high], btype=\"band\")\n","        y = lfilter(b, a, data)\n","        return y"]},{"cell_type":"code","execution_count":270,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":109402,"status":"ok","timestamp":1662211306324,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"JXENTJYsEJjH","outputId":"9700e7d1-8740-406c-e8a1-fef0114a01f6"},"outputs":[{"name":"stderr","output_type":"stream","text":["| |        #                                     | 398449 Elapsed Time: 0:01:49\n"]}],"source":["# Apply Bandpass filter to each signal\n","pbar = ProgressBar()\n","\n","heartbeats_denoise = empty_list(len(heartbeats_res))\n","for i, hb in pbar(enumerate(heartbeats_res)):\n","  signal_denoise = bandpass_filter(hb.signal, 1, 47, 500, 3)\n","  hb.signal = signal_denoise \n","  heartbeats_denoise[i] = hb"]},{"cell_type":"code","execution_count":271,"metadata":{"executionInfo":{"elapsed":384,"status":"ok","timestamp":1662211306694,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"oHF33vdoGIom"},"outputs":[],"source":["heartbeats = heartbeats_denoise\n","heartbeats_lead1 = []\n","heartbeats_lead2 = []\n","# Extract labels\n","hbs_labels = []\n","for hb in heartbeats:\n","  if hb.lead == 1:\n","    heartbeats_lead1.append(hb)\n","    hbs_labels.append(hb.label)\n","  elif hb.lead == 2:\n","    heartbeats_lead2.append(hb)"]},{"cell_type":"markdown","metadata":{"id":"BlaLtH1kgLxy"},"source":["Plot for the report"]},{"cell_type":"code","execution_count":272,"metadata":{"executionInfo":{"elapsed":1109,"status":"ok","timestamp":1662211307802,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"Bm64_aXagLx4"},"outputs":[],"source":["# One signals for each class \n","NSR_signal_lead1 = None\n","PAC_signal_lead1 = None\n","PVC_signal_lead1 = None\n","found1 = False\n","found2 = False\n","found3 = False\n","for i in range(len(heartbeats_lead1)):\n","  if heartbeats_lead1[i].label == 0 and not found1:\n","    NSR_signal_lead1 = heartbeats_lead1[i].signal\n","    found1 = True\n","  elif heartbeats_lead1[i].label == 1 and not found2:\n","    PAC_signal_lead1 = heartbeats_lead1[i].signal\n","    found2 = True\n","  elif heartbeats_lead1[i].label == 2 and not found3:\n","    PVC_signal_lead1 = heartbeats_lead1[i].signal\n","    found3 = True"]},{"cell_type":"code","execution_count":273,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":881},"executionInfo":{"elapsed":565,"status":"ok","timestamp":1662211308361,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"74MNg1gXgLx4","outputId":"6cfb7abe-2c95-4bc5-cfed-e40891fb25a4"},"outputs":[{"data":{"image/png":"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","text/plain":["<Figure size 360x288 with 1 Axes>"]},"metadata":{"needs_background":"light"},"output_type":"display_data"},{"data":{"image/png":"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","text/plain":["<Figure size 360x288 with 1 Axes>"]},"metadata":{"needs_background":"light"},"output_type":"display_data"},{"data":{"image/png":"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","text/plain":["<Figure size 360x288 with 1 Axes>"]},"metadata":{"needs_background":"light"},"output_type":"display_data"}],"source":["fig = plt.figure(figsize=(5,4))\n","t = np.arange(len(NSR_signal_lead1))\n","plt.plot(t, NSR_signal_lead1, color=\"C0\")\n","plt.xlabel('True labels', fontsize=16)\n","plt.ylabel('Predicted labels', fontsize=16)\n","plt.title('NSR heartbeat - Denoised', fontsize=20)\n","plt.show()\n","\n","\n","fig = plt.figure(figsize=(5,4))\n","t = np.arange(len(PAC_signal_lead1))\n","plt.plot(t, PAC_signal_lead1, color=\"C1\")\n","plt.xlabel('True labels', fontsize=16)\n","plt.ylabel('Predicted labels', fontsize=16)\n","plt.title('PAC heartbeat - Denoised', fontsize=20)\n","plt.show()\n","\n","fig = plt.figure(figsize=(5,4))\n","t = np.arange(len(PVC_signal_lead1))\n","plt.plot(t, PVC_signal_lead1, color=\"C2\")\n","plt.xlabel('True labels', fontsize=16)\n","plt.ylabel('Predicted labels', fontsize=16)\n","plt.title('PVC heartbeat - Denoised', fontsize=20)\n","plt.show()\n","\n","\n"]},{"cell_type":"markdown","metadata":{"id":"ztnUPkHUoX_0"},"source":["## 5. Organize data for model training"]},{"cell_type":"markdown","metadata":{"id":"WehzcTgLbLTJ"},"source":["### 5.1. **One-Hot-Encoding** of labels "]},{"cell_type":"code","execution_count":30,"metadata":{"executionInfo":{"elapsed":3,"status":"ok","timestamp":1662193840251,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"nI3XVwKdbLhc"},"outputs":[],"source":["from sklearn.preprocessing import OneHotEncoder\n","\n","# Transform labels vector into np.array\n","hbs_labels = np.asarray(hbs_labels)\n","hbs_labels = np.expand_dims(hbs_labels, 1)\n","\n","onehot_encoder = OneHotEncoder(sparse=False)\n","hbs_labels = onehot_encoder.fit_transform(hbs_labels)"]},{"cell_type":"markdown","metadata":{"id":"txBByaG1OwQX"},"source":["### 5.2. Split in **Train**, **Validation** & **Test**"]},{"cell_type":"markdown","metadata":{"id":"6wkgU5T7Q1PI"},"source":["Split Training and Test sets"]},{"cell_type":"code","execution_count":31,"metadata":{"executionInfo":{"elapsed":981,"status":"ok","timestamp":1662193841230,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"5W6ZYBD7wH9t"},"outputs":[],"source":["from sklearn.model_selection import train_test_split\n","\n","heartbeats_lead1_train, heartbeats_lead1_test, heartbeats_lead2_train, heartbeats_lead2_test, labels_train, labels_test = train_test_split(\n","    heartbeats_lead1,\n","    heartbeats_lead2,                                                                                                                                      \n","    hbs_labels,\n","    test_size=0.15,\n","    random_state=SEED,\n","    shuffle=True,\n","    stratify=hbs_labels\n",")"]},{"cell_type":"code","execution_count":32,"metadata":{"executionInfo":{"elapsed":1178,"status":"ok","timestamp":1662193842406,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"fTZh9UTEwH_X"},"outputs":[],"source":["heartbeats_lead1_train, heartbeats_lead1_valid, heartbeats_lead2_train, heartbeats_lead2_valid, labels_train, labels_valid = train_test_split(\n","heartbeats_lead1_train,\n","heartbeats_lead2_train,\n","labels_train,\n","test_size=0.25,\n","random_state=SEED,\n","shuffle=True,\n","stratify=labels_train\n",")"]},{"cell_type":"code","execution_count":33,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":22,"status":"ok","timestamp":1662193842408,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"I3dpZh5mxw1U","outputId":"c95868f6-e35c-49cf-be5c-0122b1bae781"},"outputs":[{"name":"stdout","output_type":"stream","text":["{0: 118137, 1: 4831, 2: 4037}\n","{0: 39380, 1: 1610, 2: 1346}\n","{0: 27797, 1: 1137, 2: 950}\n"]}],"source":["# Compute labels frequency in training, valid and test sets\n","values, counts = np.unique(onehot_encoder.inverse_transform(labels_train), return_counts=True)\n","print(dict(zip(values, counts)))\n","\n","values, counts = np.unique(onehot_encoder.inverse_transform(labels_valid), return_counts=True)\n","print(dict(zip(values, counts)))\n","\n","values, counts = np.unique(onehot_encoder.inverse_transform(labels_test), return_counts=True)\n","print(dict(zip(values, counts)))"]},{"cell_type":"markdown","metadata":{"id":"fFb0-UuvqOjB"},"source":["### 5.3. Extract **signal**, **RR_features** and **labels** from the 'HeartBeat' objects\n","\n","N.B. The 2 leads should be recombined to get an array of shape (128,2)"]},{"cell_type":"code","execution_count":34,"metadata":{"executionInfo":{"elapsed":17,"status":"ok","timestamp":1662193842408,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"teNxADMdP1LA"},"outputs":[],"source":["def extract_from_HeartBeats(hbs_lead1, hbs_lead2):\n","  pbar = ProgressBar()\n","  # Initialize data structures\n","  hbs_signals = empty_list(len(hbs_lead1))\n","  hbs_RRfeatures = pd.DataFrame(index=range(len(hbs_lead1)),\n","      columns=[\"pre_RR\",\"post_RR\",\"local_RR\",\"global_RR\"])\n","  hbs_labels = np.empty((len(hbs_lead1),1))\n","  hbs_aug = np.empty((len(hbs_lead1)))\n","  # Iterate across heartbeats and extract\n","  for i in pbar(range(len(hbs_lead1))):\n","    new_signal = np.c_[hbs_lead1[i].signal,\n","                       hbs_lead2[i].signal]\n","    hbs_signals[i] = new_signal\n","\n","    new_RRfeat = [hbs_lead1[i].pre_RR, hbs_lead1[i].post_RR,\n","                  hbs_lead1[i].local_RR, hbs_lead1[i].global_RR]\n","    hbs_RRfeatures.loc[i,:] = new_RRfeat\n","\n","    hbs_labels[i] = hbs_lead1[i].label\n","    hbs_aug[i] = hbs_lead1[i].aug\n","  \n","  return hbs_signals, hbs_RRfeatures, hbs_labels, hbs_aug\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":31615,"status":"ok","timestamp":1662195474321,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"M7hJyaBU_eR-","outputId":"447cac1d-3dda-4be9-da3b-75b6c0d84837"},"outputs":[],"source":["# TRAIN (original)\n","signals_train, RRfeatures_train, labels_train, _ = extract_from_HeartBeats(heartbeats_lead1_train, \n","                                                                           heartbeats_lead2_train)\n","\n","# VALIDATION (original)\n","signals_valid, RRfeatures_valid, labels_valid, _ = extract_from_HeartBeats(heartbeats_lead1_valid, \n","                                                                           heartbeats_lead2_valid)\n","\n","# TEST (original)\n","signals_test, RRfeatures_test, labels_test, _ = extract_from_HeartBeats(heartbeats_lead1_test, \n","                                                                        heartbeats_lead2_test)"]},{"cell_type":"markdown","metadata":{"id":"kF6u9YY1UrlV"},"source":["Transform lists of np.ndarray's into np.ndarray with an additional axis"]},{"cell_type":"code","execution_count":86,"metadata":{"executionInfo":{"elapsed":385,"status":"ok","timestamp":1662195474692,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"KiJ6j6ItUrES"},"outputs":[],"source":["signals_train = np.asarray(signals_train)\n","RRfeatures_train = np.asarray(RRfeatures_train)\n","\n","signals_valid = np.asarray(signals_valid)\n","RRfeatures_valid = np.asarray(RRfeatures_valid)\n","\n","signals_test = np.asarray(signals_test)\n","RRfeatures_test = np.asarray(RRfeatures_test)"]},{"cell_type":"markdown","metadata":{"id":"BtTN2bCnoJfj"},"source":["## 6. Data Augmentation\n","We use a GAN to repoduce fake samples of the least represented classes, so that eventually we have a dataset with **balanced** classes without wasting data."]},{"cell_type":"markdown","metadata":{"id":"Yn4h_CsLGKE-"},"source":["### 6.1. Data Augmentation following *Acharya et al.*\n","The samples of synthetic data are generated after preprocessing by **varying the standard deviation and mean of Z-score** calculated from the original normalized ECG signals."]},{"cell_type":"markdown","metadata":{"id":"OEyJz_EXGKE-"},"source":["Consider the signals before standardization.\n","For each signal check its label:\n","- If NSR -> standardize & update;\n","- If, instead, it is PAC or PVC:\n","> - Generate random values to change the mean and std used for standardization\n","> - Perform standardization with these new values\n","> - Compute a cropped version of the signal\n","\n","\n"]},{"cell_type":"code","execution_count":79,"metadata":{"executionInfo":{"elapsed":270,"status":"ok","timestamp":1662195291699,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"Kfblk8AWOBGq"},"outputs":[],"source":["# CROPPING AND RESAMPLING -> SHIFTING + DILATATION\n","# Randomly crop the first or last part of the signal.\n","# Resample at the desired length\n","def crop_signal(signal):\n","  init_len = len(signal)\n","\n","  # Crop left & right\n","  crop_left = int(np.random.uniform(1,16))\n","  crop_right = int(np.random.uniform(1,16))\n","  crop_signal = signal[crop_left:-crop_right]\n","  # Resize\n","  crop_signal = scipy.signal.resample(crop_signal, init_len)\n","\n","  return crop_signal\n","\n","\n","def Zscore_Data_Augmentation(signal, label, class_ratios):\n","  aug_signal = None\n","  # Number of augmented samples to create \n","  n_PAC_aug = round(class_ratios[0]) \n","  n_PVC_aug = round(class_ratios[1])\n","\n","  # Compute mean and std for the current signal\n","  curr_mean = np.mean(signal)\n","  curr_std = np.std(signal)\n","  \n","  # Check labels\n","  if label == 0: # NSR\n","    # Perform standardization\n","    aug_signal = Zscore_Standardization(signal,\n","                                        curr_mean, curr_std)\n","  \n","    aug_signal = np.expand_dims(aug_signal, 0)\n","  \n","  else: # PAC or PVC\n","    # Generate HALF of the synthetic samples by changing mean and std values\n","    # in Zscore standardization, while the other HALF is generated by randomly \n","    # cropping each augmented signal\n","    if label == 1:\n","      aug_signal = empty_list(round((n_PAC_aug-0.01)/2)*2) # to get one less sample when number is odd\n","    elif label == 2:\n","      aug_signal = empty_list(round((n_PVC_aug-0.01)/2)*2)\n","    for i in range(0,len(aug_signal),2):\n","      # Modify values up to 1/3 of their original value\n","      rnd1 = np.random.uniform(-curr_mean/3, curr_mean/3)\n","      rnd2 = np.random.uniform(-curr_std/3, curr_std/3)\n","      # Standardize with the new values\n","      zaug_signal = Zscore_Standardization(signal,\n","                                           curr_mean + rnd1, \n","                                           curr_std + rnd2)\n","      cropaug_signal = crop_signal(zaug_signal)\n","      # Store new values\n","      aug_signal[i] = zaug_signal\n","      aug_signal[i+1] = cropaug_signal\n","\n","    aug_signal = np.asarray(aug_signal)\n","\n","  return aug_signal"]},{"cell_type":"code","execution_count":80,"metadata":{"executionInfo":{"elapsed":247,"status":"ok","timestamp":1662195293995,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"rLQk3VwTMycD"},"outputs":[],"source":["def Dataset_Augmentation(signals, labels, features, NSR_len):\n","\n","  # Compute classes ratios\n","  values, counts = np.unique(labels, return_counts=True)\n","  classes_ratios = [round(counts[0]/counts[1]), round(counts[0]/counts[2])] \n","\n","  # Create empty data structures\n","  # signals_aug = np.empty((NSR_len*3,128,2))\n","  # labels_aug = np.empty((NSR_len*3,1))\n","  # features_aug = np.empty((NSR_len*3,4))\n","  # original_idxs = np.empty((NSR_len*3,)) # to keep track of the original signal\n","  signals_aug = []\n","  labels_aug = []\n","  features_aug = []\n","  original_idxs = [] # to keep track of the original signal\n","\n","  pbar = ProgressBar()\n","  for i,sign in pbar(enumerate(signals)):\n","    # Get augmented signals for each lead\n","    # LEAD 1:\n","    curr_signal = sign[:,0]\n","    curr_label = labels[i]\n","    new_signals_lead1 = Zscore_Data_Augmentation(curr_signal, curr_label, classes_ratios)\n","\n","    # LEAD 2:\n","    curr_signal = sign[:,1]\n","    new_signals_lead2 = Zscore_Data_Augmentation(curr_signal, curr_label, classes_ratios)\n","\n","    # Store the augmented signals in new HeartBeat objects\n","    for j in range(new_signals_lead1.shape[0]):\n","      # Recombine the signals\n","      new_signal = np.column_stack((new_signals_lead1[j], new_signals_lead2[j]))\n","      signals_aug.append(new_signal)\n","      # Store the corresp label\n","      labels_aug.append(labels[i])\n","      # Store the corresp RR features\n","      features_aug.append(features[i,:])\n","      # Associate index of original signal\n","      original_idxs.append(i)\n","\n","  signals_aug = np.asarray(signals_aug)\n","  labels_aug = np.asarray(labels_aug)\n","  features_aug = np.array(features_aug, dtype=\"float64\")\n","  original_idxs = np.asarray(original_idxs)\n","\n","  return signals_aug, labels_aug, features_aug, original_idxs\n","  "]},{"cell_type":"code","execution_count":37,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":11,"status":"ok","timestamp":1662193875191,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"cyNqzxUUB3N9","outputId":"245bd780-80d5-4e9d-de72-5483724ac8ee"},"outputs":[{"name":"stdout","output_type":"stream","text":["{0.0: 118137, 1.0: 4831, 2.0: 4037}\n","{0.0: 39380, 1.0: 1610, 2.0: 1346}\n","{0.0: 27797, 1.0: 1137, 2.0: 950}\n"]}],"source":["# Compute labels frequency in AUGMENTED training, valid and test sets\n","values, counts = np.unique(labels_train, return_counts=True)\n","print(dict(zip(values, counts)))\n","ratios_train = [round(counts[0]/counts[1]), round(counts[0]/counts[2])] \n","\n","values, counts = np.unique(labels_valid, return_counts=True)\n","print(dict(zip(values, counts)))\n","ratios_valid = [round(counts[0]/counts[1]), round(counts[0]/counts[2])] \n","\n","values, counts = np.unique(labels_test, return_counts=True)\n","print(dict(zip(values, counts)))\n","ratios_test = [round(counts[0]/counts[1]), round(counts[0]/counts[2])] "]},{"cell_type":"markdown","metadata":{"id":"r1jLMK8lk8wH"},"source":["### 6.2. Data Augmentation only considering a subsample of NSR signals\n","Otherwise the computational cost both in terms of memory requirements and time is too high.\n","\n","We randomly select n_NSR signals from the NSR ones. Then we perform Data Augmentation to match that number of samples for the signals of the other classes."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":1447,"status":"ok","timestamp":1662024416638,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"Fbzfi7jnlqJt","outputId":"2e26e295-dd59-488e-aa26-7dadcb598ea1"},"outputs":[],"source":["# # Training set reduction\n","# values, counts = np.unique(labels_train, return_counts=True)\n","# n_NSR_train = 100000\n","# signals_train_reduced = []\n","# labels_train_reduced = []\n","# RRfeatures_train_reduced = []\n","# NSR_count = 0\n","# # Shuffle the dataset and labels\n","# np.random.seed(SEED)\n","# np.random.shuffle(signals_train)\n","# np.random.seed(SEED)\n","# np.random.shuffle(labels_train)\n","# np.random.seed(SEED)\n","# np.random.shuffle(RRfeatures_train)\n","# for i,signal in enumerate(signals_train):\n","#   if labels_train[i] == 0 and NSR_count<=n_NSR_train:\n","#     signals_train_reduced.append(signal)\n","#     labels_train_reduced.append(labels_train[i])\n","#     RRfeatures_train_reduced.append(RRfeatures_train[i])\n","#     NSR_count = NSR_count+1\n","#   elif labels_train[i] == 1 or labels_train[i] == 2:\n","#     signals_train_reduced.append(signal)\n","#     labels_train_reduced.append(labels_train[i])\n","#     RRfeatures_train_reduced.append(RRfeatures_train[i])\n","\n","# signals_train_reduced = np.array(signals_train_reduced)\n","# labels_train_reduced = np.array(labels_train_reduced)\n","# RRfeatures_train_reduced = np.array(RRfeatures_train_reduced)\n","# print(signals_train_reduced.shape)\n","# print(labels_train_reduced.shape)\n","# print(RRfeatures_train_reduced.shape)\n","# print(n_NSR_train+counts[1]+counts[2])"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":584,"status":"ok","timestamp":1662024418820,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"yaQ7JECDw8gs","outputId":"35c093f7-0486-457b-dc83-b7460af95626"},"outputs":[],"source":["# # Validation set reduction\n","# values, counts = np.unique(labels_valid, return_counts=True)\n","# n_NSR_valid = 25000\n","# signals_valid_reduced = []\n","# labels_valid_reduced = []\n","# RRfeatures_valid_reduced = []\n","# NSR_count = 0\n","# # Shuffle the dataset and labels\n","# np.random.seed(SEED)\n","# np.random.shuffle(signals_valid)\n","# np.random.seed(SEED)\n","# np.random.shuffle(labels_valid)\n","# np.random.seed(SEED)\n","# np.random.shuffle(RRfeatures_valid)\n","# for i,signal in enumerate(signals_valid):\n","#   if labels_valid[i] == 0 and NSR_count<=n_NSR_valid:\n","#     signals_valid_reduced.append(signal)\n","#     labels_valid_reduced.append(labels_valid[i])\n","#     RRfeatures_valid_reduced.append(RRfeatures_valid[i])\n","#     NSR_count = NSR_count+1\n","#   elif labels_valid[i] == 1 or labels_valid[i] == 2:\n","#     signals_valid_reduced.append(signal)\n","#     labels_valid_reduced.append(labels_valid[i])\n","#     RRfeatures_valid_reduced.append(RRfeatures_valid[i])\n","\n","# signals_valid_reduced = np.array(signals_valid_reduced)\n","# labels_valid_reduced = np.array(labels_valid_reduced)\n","# RRfeatures_valid_reduced = np.array(RRfeatures_valid_reduced)\n","# print(signals_valid_reduced.shape)\n","# print(labels_valid_reduced.shape)\n","# print(RRfeatures_valid_reduced.shape)\n","# print(n_NSR_valid+counts[1]+counts[2])"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":37940,"status":"ok","timestamp":1662024459815,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"tbwr6pgiO6Jt","outputId":"0afbb0e4-f479-45ad-e63f-bd32cb1c9738"},"outputs":[],"source":["# # Training set data augmentation\n","# signals_train_aug, labels_train_aug, RRfeatures_train_aug, original_idxs_train = Dataset_Augmentation(signals_train_reduced, \n","#                                                                                                       labels_train_reduced, \n","#                                                                                                       RRfeatures_train_reduced,\n","#                                                                                                       NSR_len=n_NSR_train)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":44222,"status":"ok","timestamp":1662024923185,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"c0pjQvZDZpDj","outputId":"a9aa7c0d-ea20-40fc-8669-ec84dae1bb8f"},"outputs":[],"source":["# # Training set data augmentation\n","# signals_train_aug, labels_train_aug, RRfeatures_train_aug, original_idxs_train = Dataset_Augmentation(signals_train, \n","#                                                                                                       labels_train, \n","#                                                                                                       RRfeatures_train,\n","#                                                                                                       NSR_len=len(signals_train))"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":234,"status":"ok","timestamp":1662024941877,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"BIy2_bLVYkrT","outputId":"35cdb3ff-eb5f-4c97-f4a1-df47e73a767a"},"outputs":[{"name":"stdout","output_type":"stream","text":["[118137 115944 113036]\n"]}],"source":["# values, counts = np.unique(labels_train_aug, return_counts=True)\n","# print(counts)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":12214,"status":"ok","timestamp":1662024472013,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"15zkxA6xzqUf","outputId":"bf8b7cad-f38a-4f68-f531-a34992098292"},"outputs":[],"source":["# # Validation set data augmentation\n","# signals_valid_aug, labels_valid_aug, RRfeatures_valid_aug, original_idxs_valid = Dataset_Augmentation(signals_valid_reduced, \n","#                                                                                                       labels_valid_reduced, \n","#                                                                                                       RRfeatures_valid_reduced,\n","#                                                                                                       NSR_len=n_NSR_valid)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":14468,"status":"ok","timestamp":1662024961057,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"UVnEOWSNZ5P6","outputId":"acce2738-d659-4453-ed5f-2204b1fac02d"},"outputs":[],"source":["# # Validation set data augmentation\n","# signals_valid_aug, labels_valid_aug, RRfeatures_valid_aug, original_idxs_valid = Dataset_Augmentation(signals_valid, \n","#                                                                                                       labels_valid, \n","#                                                                                                       RRfeatures_valid,\n","#                                                                                                       NSR_len=signals_valid)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":16,"status":"ok","timestamp":1662024961058,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"qTFbRXURzqUh","outputId":"98b86c6e-5c14-4a0d-f837-598f3d5cd4a9"},"outputs":[],"source":["# print(signals_valid_aug.shape)\n","# print(labels_valid_aug.shape)\n","# print(RRfeatures_valid_aug.shape)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":15,"status":"ok","timestamp":1662024961058,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"upe8LfUDYv0K","outputId":"850fbcf7-20ab-4ef3-9412-15adad642deb"},"outputs":[{"name":"stdout","output_type":"stream","text":["[39380 38640 37688]\n"]}],"source":["# values, counts = np.unique(labels_valid_aug, return_counts=True)\n","# print(counts)"]},{"cell_type":"markdown","metadata":{"id":"xpA-5k08A5PK"},"source":["Save augmented data on disk"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"COEV5pUdA4h4"},"outputs":[],"source":["# # Train\n","# train_dir2 = \"/content/drive/MyDrive/AI_IN_BIOMEDICINE/PROJECT/AugmentedData/Train\"\n","# np.save(file=os.path.join(train_dir2, \"Signals_Train_Aug\"), arr=signals_train_aug)\n","# np.save(file=os.path.join(train_dir2, \"Features_Train_Aug\"), arr=RRfeatures_train_aug)\n","# np.save(file=os.path.join(train_dir2, \"Labels_Train_Aug\"), arr=labels_train_aug)\n","\n","# # Valid\n","# valid_dir2 = \"/content/drive/MyDrive/AI_IN_BIOMEDICINE/PROJECT/AugmentedData/Valid\"\n","# np.save(file=os.path.join(valid_dir2, \"Signals_Valid_Aug\"), arr=signals_valid_aug)\n","# np.save(file=os.path.join(valid_dir2, \"Feature_Valid_Aug\"), arr=RRfeatures_valid_aug)\n","# np.save(file=os.path.join(valid_dir2, \"Labels_Valid_Aug\"), arr=labels_valid_aug)"]},{"cell_type":"markdown","metadata":{"id":"LDxzE4mADX_9"},"source":["### 6.3. Load Augmented Data for training\n","To load one batch at the time the Augmented data saved in memory"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"54zduBszEQqu"},"outputs":[],"source":["# Data generators from mmap arrays\n","def generate_label_shuffle(labels):\n","    while True:\n","        for i in labels:\n","          lab_generated = i\n","          yield lab_generated\n","\n","def generate_signal_shuffle(signals):\n","    while True:\n","        for i in signals:\n","          signal_generated = i\n","          yield signal_generated\n","\n","def generate_feature_shuffle(features):\n","    while True:\n","        for i in features:\n","          features_generated = i          \n","          yield  features_generated "]},{"cell_type":"code","execution_count":null,"metadata":{"id":"kS5DxAW8Dc3W"},"outputs":[],"source":["# Batch generator for training data \n","def batch_data_generator(batch_size, x_gen, f_gen,  y_gen):\n","  batch_features = np.zeros((batch_size,4))\n","  batch_signals = np.zeros((batch_size,128,2)) \n","  batch_labels = np.zeros((batch_size,1))    \n","  while True:\n","    for i in range(batch_size):\n","        batch_features[i] = next(f_gen)\n","        batch_signals[i] = next(x_gen)\n","        batch_labels[i] = next(y_gen)\n","     \n","    yield {'ecg_signal': np.array(batch_signals),\n","           'wide_features': np.array(batch_features, dtype=\"float64\")},{'softmax_classifier': np.array(batch_labels)}"]},{"cell_type":"markdown","metadata":{"id":"7Toi5FutFLOm"},"source":["Load **Training data** in *read-only* format"]},{"cell_type":"code","execution_count":39,"metadata":{"executionInfo":{"elapsed":1522,"status":"ok","timestamp":1662193876943,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"EmmmNlKuFKNW"},"outputs":[],"source":["train_dir2 = \"/content/drive/MyDrive/AI_IN_BIOMEDICINE/PROJECT/AugmentedData/Train\"\n","signals_train_aug = np.load(file=os.path.join(train_dir2,\"Signals_Train_Aug.npy\"), mmap_mode=\"r\")\n","labels_train_aug = np.load(file=os.path.join(train_dir2,\"Labels_Train_Aug.npy\"), mmap_mode=\"r\")\n","features_train_aug = np.load(file=os.path.join(train_dir2,\"Features_Train_Aug.npy\"), mmap_mode=\"r\")"]},{"cell_type":"markdown","metadata":{"id":"6mogVGxenmT3"},"source":["**One-Hot-Encoding** of the labels"]},{"cell_type":"code","execution_count":40,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":11,"status":"ok","timestamp":1662193876944,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"soxDswHCnmT3","outputId":"a3cdef6c-c007-4f6c-fe96-147199dc8777"},"outputs":[{"name":"stdout","output_type":"stream","text":["(347117, 3)\n"]}],"source":["labels_train_aug = tf.keras.utils.to_categorical(labels_train_aug, num_classes=3)\n","print(labels_train_aug.shape)"]},{"cell_type":"markdown","metadata":{"id":"mIYiaMGDEFsJ"},"source":["Load **Validation data** in *read-only* format"]},{"cell_type":"code","execution_count":41,"metadata":{"executionInfo":{"elapsed":1371,"status":"ok","timestamp":1662193878311,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"7pVyKP60EEiF"},"outputs":[],"source":["valid_dir2 = \"/content/drive/MyDrive/AI_IN_BIOMEDICINE/PROJECT/AugmentedData/Valid\"\n","signals_valid_aug = np.load(file=os.path.join(valid_dir2,\"Signals_Valid_Aug.npy\"), mmap_mode=\"r\")\n","labels_valid_aug = np.load(file=os.path.join(valid_dir2,\"Labels_Valid_Aug.npy\"), mmap_mode=\"r\")\n","features_valid_aug = np.load(file=os.path.join(valid_dir2,\"Feature_Valid_Aug.npy\"), mmap_mode=\"r\")"]},{"cell_type":"markdown","metadata":{"id":"Kalzsj9cnXFX"},"source":["**One-Hot-Encoding** of the labels"]},{"cell_type":"code","execution_count":42,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":13,"status":"ok","timestamp":1662193878312,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"IOr2RSCMnbIx","outputId":"95d3e81b-4b2c-4eed-fd60-9247a17ffb8e"},"outputs":[{"name":"stdout","output_type":"stream","text":["(115708, 3)\n"]}],"source":["labels_valid_aug = tf.keras.utils.to_categorical(labels_valid_aug, num_classes=3)\n","print(labels_valid_aug.shape)"]},{"cell_type":"markdown","metadata":{"id":"NsfD8DUSSIuT"},"source":["## 7. Model Definition and Training"]},{"cell_type":"code","execution_count":38,"metadata":{"executionInfo":{"elapsed":11,"status":"ok","timestamp":1662193875428,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"bTX6_npOSbV-"},"outputs":[],"source":["input_shape = (128,2)\n","num_classes = 3\n","batchsize = 64"]},{"cell_type":"markdown","metadata":{"id":"Tm7zjBFd1tSJ"},"source":["### 7.1. **ResNet** + **Wide features** trained on the **Augmented Training set**"]},{"cell_type":"code","execution_count":43,"metadata":{"executionInfo":{"elapsed":25,"status":"ok","timestamp":1662032482655,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"zdRRb3bjWqWu"},"outputs":[],"source":["# ResNet model definition \n","def ResBs_Conv(block_input, num_filters): \n","   \n","    # 0. Filter Block input and BatchNormalization\n","    block_input = Conv1D(num_filters, kernel_size=7, strides = 2,  padding = 'same')(block_input) \n","    block_input = BatchNormalization()(block_input)\n","\n","    # 1. First Convolutional Layer\n","    conv1 = Conv1D(filters=num_filters, kernel_size=7, padding= 'same')(block_input)\n","    norm1 = BatchNormalization()(conv1)\n","    relu1 = Activation('relu')(norm1)  \n","    dropout = Dropout(0.2)(relu1)\n","    \n","    # 2. Second Convolutional Layer \n","    conv2 = Conv1D(num_filters, kernel_size=7, padding= 'same')(dropout)\n","    norm2 = BatchNormalization()(conv2)\n","\n","    # 3. Summing Layer (adding a residual connection)\n","    sum = Add()([block_input, norm2])\n","    \n","    # 4. Activation Layer\n","    relu2 = Activation('relu')(sum)\n","    \n","    return relu2 \n","\n","def ResBs_Identity(block_input, num_filters): \n","\n","    # 1. First Convolutional Layer\n","    conv1 = Conv1D(filters=num_filters, kernel_size=7, padding= 'same')(block_input)\n","    norm1 = BatchNormalization()(conv1)\n","    relu1 = Activation('relu')(norm1)    \n","    dropout = Dropout(0.2)(relu1)\n","    \n","    # 2. Second Convolutional Layer \n","    conv2 = Conv1D(num_filters, kernel_size=7, padding= 'same')(dropout) #per avere concordanza\n","    norm2 = BatchNormalization()(conv2)\n","\n","    # 3. Summing Layer (adding a residual connection)\n","    sum = Add()([block_input, norm2])\n","    \n","    # 4. Activation Layer\n","    relu2 = Activation('relu')(sum)\n","    \n","    return relu2 \n","\n","def resnet(N=8, ch=2, win_len=128, classes=3): \n","    ecg_input = Input(shape=(win_len, ch), name='ecg_signal') \n","\n","    ResNet = Conv1D(filters=64, kernel_size=15, padding = 'same')(ecg_input) \n","    ResNet = BatchNormalization()(ResNet)\n","    ResNet = Activation('relu')(ResNet)\n","    ResNet = MaxPooling1D(pool_size=2, strides = 2)(ResNet)\n","    \n","    # B.5 ResBs (x8) blocks\n","    # First two ResNet blocks are identity blocks \n","    ResNet = ResBs_Identity(ResNet, 64)\n","    ResNet = ResBs_Identity(ResNet, 64)\n","\n","    filters = 64\n","    M= int((N-2)/2)\n","    for i in range(M): \n","        filters = filters*2\n","        # define N-th ResBs block\n","        ResNet = ResBs_Conv(ResNet, filters)\n","        ResNet = ResBs_Identity(ResNet, filters)\n","    \n","    ResNet = GlobalMaxPooling1D(name='gmp_layer')(ResNet)\n","    ResNet = Flatten()(ResNet) \n","\n","    # Sigmoid activation function on the last layer\n","    ResNet = Dense(classes, activation='softmax',  name='softmax_classifier')(ResNet)\n","\n","    # Finally the model is composed by connecting inputs to outputs: \n","    model = Model(inputs=[ecg_input],outputs=ResNet)\n","    return model\n"]},{"cell_type":"code","execution_count":44,"metadata":{"executionInfo":{"elapsed":25,"status":"ok","timestamp":1662032482656,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"PDu6vF-r1tSJ"},"outputs":[],"source":["# model integrating deep + wide \n","def resnet_deep_wide(N, ch, win_len, num_wide_features, classes): \n","    # A. Wide features\n","    wide_input = Input(shape=(num_wide_features,), name ='wide_features')\n","    wide_branch = Dense(4, activation='relu')(wide_input)\n","    wide_branch = Dense(2, activation='relu')(wide_branch)\n","\n","    # B. ECG window input of shape (batch_size,  WINDOW_LEN, CHANNELS)\n","    ecg_input = Input(shape=(win_len, ch), name='ecg_signal') \n","\n","    ResNet = Conv1D(filters=64,kernel_size=15, padding = 'same')(ecg_input) \n","    ResNet = BatchNormalization()(ResNet)\n","    ResNet = Activation('relu')(ResNet)\n","    ResNet = MaxPooling1D(pool_size=2, strides = 2)(ResNet)\n","    \n","    # B.5 ResBs (x8) blocks\n","    # The number of filters starts from 64 and doubles every two blocks\n","    \n","    # First two ResNet blocks are identity blocks \n","    ResNet = ResBs_Identity(ResNet, 64)\n","    ResNet = ResBs_Identity(ResNet, 64)\n","\n","    filters = 64\n","    M= int((N-2)/2)\n","    for i in range(M): \n","        filters = filters*2\n","\n","        # define N-th ResBs block\n","        ResNet = ResBs_Conv(ResNet, filters)\n","        ResNet = ResBs_Identity(ResNet, filters)\n","    \n","    ResNet = GlobalMaxPooling1D(name='gmp_layer')(ResNet)\n","    ResNet = Flatten()(ResNet)\n","\n","    shared_path = concatenate([ResNet, wide_branch], name='concat_layer')\n","    shared_path = Dense(classes, activation='softmax', name='softmax_classifier')(shared_path)\n","   \n","    # Finally the model is composed by connecting inputs to outputs: \n","    model = Model(inputs=[ecg_input,  wide_input],outputs=shared_path)\n","\n","    return model"]},{"cell_type":"code","execution_count":45,"metadata":{"executionInfo":{"elapsed":4832,"status":"ok","timestamp":1662032487465,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"mNMqzCHr1tSK"},"outputs":[],"source":["resNet_deep_wide_model = resnet_deep_wide(N=8, ch=2, win_len=128, num_wide_features= 4, classes=3)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"2uuQIenhNig8"},"outputs":[],"source":["resNet_deep_wide_model.summary()"]},{"cell_type":"code","execution_count":46,"metadata":{"executionInfo":{"elapsed":16,"status":"ok","timestamp":1662032487466,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"d4Fai0Yo1tSK"},"outputs":[],"source":["resNet_deep_wide_model.compile(\n","    optimizer = keras.optimizers.Adam(learning_rate = 0.01),\n","    loss = keras.losses.CategoricalCrossentropy(),\n","    metrics = ['accuracy', 'Precision', 'Recall']\n",")"]},{"cell_type":"code","execution_count":47,"metadata":{"executionInfo":{"elapsed":15,"status":"ok","timestamp":1662032487466,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"vn_TNXHL1tSL"},"outputs":[],"source":["from keras.callbacks import EarlyStopping, ReduceLROnPlateau\n","\n","early_stop = EarlyStopping(monitor=\"val_loss\",\n","                           patience=20,\n","                           restore_best_weights=True)\n","\n","reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.1,\n","                              patience=8, min_lr=0.0001, verbose=1)\n","\n","clbks = [early_stop, reduce_lr]"]},{"cell_type":"code","execution_count":48,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":5632066,"status":"ok","timestamp":1662038119517,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"tdVw8oBfipUx","outputId":"bd478c7a-6a36-43a6-93f0-225e70517a90"},"outputs":[{"name":"stdout","output_type":"stream","text":["Epoch 1/40\n","5423/5423 [==============================] - 257s 44ms/step - loss: 0.2453 - accuracy: 0.9163 - precision: 0.9220 - recall: 0.9106 - val_loss: 0.3817 - val_accuracy: 0.8806 - val_precision: 0.8839 - val_recall: 0.8776 - lr: 0.0100\n","Epoch 2/40\n","5423/5423 [==============================] - 234s 43ms/step - loss: 0.1072 - accuracy: 0.9623 - precision: 0.9634 - recall: 0.9614 - val_loss: 0.1132 - val_accuracy: 0.9646 - val_precision: 0.9650 - val_recall: 0.9641 - lr: 0.0100\n","Epoch 3/40\n","5423/5423 [==============================] - 234s 43ms/step - loss: 0.0785 - accuracy: 0.9720 - precision: 0.9725 - recall: 0.9715 - val_loss: 0.1067 - val_accuracy: 0.9671 - val_precision: 0.9676 - val_recall: 0.9666 - lr: 0.0100\n","Epoch 4/40\n","5423/5423 [==============================] - 234s 43ms/step - loss: 0.0571 - accuracy: 0.9793 - precision: 0.9796 - recall: 0.9790 - val_loss: 0.1002 - val_accuracy: 0.9719 - val_precision: 0.9722 - val_recall: 0.9716 - lr: 0.0100\n","Epoch 5/40\n","5423/5423 [==============================] - 233s 43ms/step - loss: 0.0480 - accuracy: 0.9826 - precision: 0.9828 - recall: 0.9825 - val_loss: 0.1013 - val_accuracy: 0.9720 - val_precision: 0.9723 - val_recall: 0.9718 - lr: 0.0100\n","Epoch 6/40\n","5423/5423 [==============================] - 233s 43ms/step - loss: 0.0390 - accuracy: 0.9857 - precision: 0.9858 - recall: 0.9855 - val_loss: 0.1136 - val_accuracy: 0.9712 - val_precision: 0.9713 - val_recall: 0.9709 - lr: 0.0100\n","Epoch 7/40\n","5423/5423 [==============================] - 233s 43ms/step - loss: 0.0340 - accuracy: 0.9873 - precision: 0.9874 - recall: 0.9872 - val_loss: 0.1123 - val_accuracy: 0.9724 - val_precision: 0.9727 - val_recall: 0.9721 - lr: 0.0100\n","Epoch 8/40\n","5423/5423 [==============================] - 233s 43ms/step - loss: 0.0311 - accuracy: 0.9883 - precision: 0.9884 - recall: 0.9882 - val_loss: 0.1268 - val_accuracy: 0.9705 - val_precision: 0.9709 - val_recall: 0.9704 - lr: 0.0100\n","Epoch 9/40\n","5423/5423 [==============================] - 233s 43ms/step - loss: 0.0281 - accuracy: 0.9894 - precision: 0.9895 - recall: 0.9893 - val_loss: 0.1062 - val_accuracy: 0.9749 - val_precision: 0.9749 - val_recall: 0.9747 - lr: 0.0100\n","Epoch 10/40\n","5423/5423 [==============================] - 232s 43ms/step - loss: 0.0260 - accuracy: 0.9902 - precision: 0.9902 - recall: 0.9901 - val_loss: 0.1178 - val_accuracy: 0.9753 - val_precision: 0.9756 - val_recall: 0.9752 - lr: 0.0100\n","Epoch 11/40\n","5423/5423 [==============================] - 233s 43ms/step - loss: 0.0252 - accuracy: 0.9907 - precision: 0.9907 - recall: 0.9906 - val_loss: 0.1134 - val_accuracy: 0.9764 - val_precision: 0.9766 - val_recall: 0.9762 - lr: 0.0100\n","Epoch 12/40\n","5423/5423 [============================>.] - ETA: 0s - loss: 0.0231 - accuracy: 0.9911 - precision: 0.9912 - recall: 0.9910\n","Epoch 12: ReduceLROnPlateau reducing learning rate to 0.0009999999776482583.\n","5423/5423 [==============================] - 232s 43ms/step - loss: 0.0231 - accuracy: 0.9911 - precision: 0.9912 - recall: 0.9910 - val_loss: 0.1758 - val_accuracy: 0.9656 - val_precision: 0.9657 - val_recall: 0.9656 - lr: 0.0100\n","Epoch 13/40\n","5423/5423 [==============================] - 232s 43ms/step - loss: 0.0131 - accuracy: 0.9947 - precision: 0.9947 - recall: 0.9947 - val_loss: 0.1273 - val_accuracy: 0.9786 - val_precision: 0.9787 - val_recall: 0.9786 - lr: 1.0000e-03\n","Epoch 14/40\n","5423/5423 [==============================] - 232s 43ms/step - loss: 0.0098 - accuracy: 0.9961 - precision: 0.9961 - recall: 0.9961 - val_loss: 0.1382 - val_accuracy: 0.9792 - val_precision: 0.9793 - val_recall: 0.9792 - lr: 1.0000e-03\n","Epoch 15/40\n","5423/5423 [==============================] - 233s 43ms/step - loss: 0.0086 - accuracy: 0.9966 - precision: 0.9966 - recall: 0.9966 - val_loss: 0.1556 - val_accuracy: 0.9786 - val_precision: 0.9786 - val_recall: 0.9785 - lr: 1.0000e-03\n","Epoch 16/40\n","5423/5423 [==============================] - 233s 43ms/step - loss: 0.0077 - accuracy: 0.9968 - precision: 0.9969 - recall: 0.9968 - val_loss: 0.1648 - val_accuracy: 0.9787 - val_precision: 0.9788 - val_recall: 0.9787 - lr: 1.0000e-03\n","Epoch 17/40\n","5423/5423 [==============================] - 233s 43ms/step - loss: 0.0072 - accuracy: 0.9970 - precision: 0.9971 - recall: 0.9970 - val_loss: 0.1699 - val_accuracy: 0.9790 - val_precision: 0.9791 - val_recall: 0.9790 - lr: 1.0000e-03\n","Epoch 18/40\n","5423/5423 [==============================] - 233s 43ms/step - loss: 0.0065 - accuracy: 0.9974 - precision: 0.9974 - recall: 0.9974 - val_loss: 0.1800 - val_accuracy: 0.9790 - val_precision: 0.9791 - val_recall: 0.9790 - lr: 1.0000e-03\n","Epoch 19/40\n","5423/5423 [==============================] - 233s 43ms/step - loss: 0.0061 - accuracy: 0.9976 - precision: 0.9976 - recall: 0.9976 - val_loss: 0.1903 - val_accuracy: 0.9790 - val_precision: 0.9790 - val_recall: 0.9789 - lr: 1.0000e-03\n","Epoch 20/40\n","5423/5423 [============================>.] - ETA: 0s - loss: 0.0058 - accuracy: 0.9977 - precision: 0.9977 - recall: 0.9977\n","Epoch 20: ReduceLROnPlateau reducing learning rate to 0.0001.\n","5423/5423 [==============================] - 232s 43ms/step - loss: 0.0058 - accuracy: 0.9977 - precision: 0.9977 - recall: 0.9977 - val_loss: 0.2080 - val_accuracy: 0.9777 - val_precision: 0.9777 - val_recall: 0.9777 - lr: 1.0000e-03\n","Epoch 21/40\n","5423/5423 [==============================] - 237s 44ms/step - loss: 0.0048 - accuracy: 0.9982 - precision: 0.9982 - recall: 0.9982 - val_loss: 0.2009 - val_accuracy: 0.9785 - val_precision: 0.9785 - val_recall: 0.9785 - lr: 1.0000e-04\n","Epoch 22/40\n","5423/5423 [==============================] - 234s 43ms/step - loss: 0.0047 - accuracy: 0.9983 - precision: 0.9983 - recall: 0.9983 - val_loss: 0.2024 - val_accuracy: 0.9788 - val_precision: 0.9788 - val_recall: 0.9787 - lr: 1.0000e-04\n","Epoch 23/40\n","5423/5423 [==============================] - 234s 43ms/step - loss: 0.0044 - accuracy: 0.9983 - precision: 0.9983 - recall: 0.9983 - val_loss: 0.2068 - val_accuracy: 0.9786 - val_precision: 0.9787 - val_recall: 0.9786 - lr: 1.0000e-04\n","Epoch 24/40\n","5423/5423 [==============================] - 234s 43ms/step - loss: 0.0043 - accuracy: 0.9983 - precision: 0.9983 - recall: 0.9983 - val_loss: 0.2079 - val_accuracy: 0.9786 - val_precision: 0.9786 - val_recall: 0.9786 - lr: 1.0000e-04\n"]}],"source":["history = resNet_deep_wide_model.fit(\n","    x=[signals_train_aug,features_train_aug],\n","    y=labels_train_aug,\n","    validation_data=([signals_valid_aug, features_valid_aug], \n","                     labels_valid_aug),\n","    steps_per_epoch=(len(signals_train_aug)/batchsize),\n","    batch_size = batchsize,\n","    epochs = 20,\n","    callbacks = clbks\n",").history"]},{"cell_type":"code","execution_count":49,"metadata":{"executionInfo":{"elapsed":1120,"status":"ok","timestamp":1662038887118,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"6GoF9GvE1tSL"},"outputs":[],"source":["# # Save trained model\n","# model_directory = '/content/drive/MyDrive/AI_IN_BIOMEDICINE/PROJECT/Models/'\n","# filename = 'augmented_wide_resNet_trained'\n","# filename_chosen = os.path.join(model_directory, filename)\n","# resNet_deep_wide_model.save(filename_chosen + '.h5')"]},{"cell_type":"markdown","metadata":{"id":"9VVXu9uE6S08"},"source":["### 7.2. Load Pre-Trained Models"]},{"cell_type":"markdown","metadata":{"id":"2kupv5Od6b-E"},"source":["Wide ResNet model"]},{"cell_type":"code","execution_count":44,"metadata":{"executionInfo":{"elapsed":6219,"status":"ok","timestamp":1662193885885,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"yeODEtL16cY9"},"outputs":[],"source":["resNet_deep_wide_model = load_model(\"/content/drive/MyDrive/AI_IN_BIOMEDICINE/PROJECT/Models/augmented_wide_resNet_trained.h5\")"]},{"cell_type":"markdown","metadata":{"id":"tdSP-NrodpNJ"},"source":["## 8. Model Evaluation"]},{"cell_type":"markdown","metadata":{"id":"wL7J9iRydt1A"},"source":["### 8.1. Learning Performances on Training & Validation"]},{"cell_type":"code","execution_count":67,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"executionInfo":{"elapsed":515,"status":"ok","timestamp":1662040374015,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"yEi_vPt2duA9","outputId":"069704ca-2352-4c54-9f9a-63aa21f7e559"},"outputs":[{"data":{"text/plain":["<matplotlib.legend.Legend at 0x7f7968296350>"]},"execution_count":67,"metadata":{},"output_type":"execute_result"},{"data":{"image/png":"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WlraYd+rDZoHXOfNoDoayFfVbSLyLvAXEUnxzvsJcGuogjTG7C0QUMr9AcoqApRV+imrdK+lFYHq9bJKd7zCH6hJJlXxB2rWAwp+VZd4Btx2SYXfJcBF5ewuriC/xL3meesV/n3S2BYlNirCkuQ6JXhf9RXlWJJszGHIy8vj4YcfrjNJrqysJDKy/o+M+fPn13usyl133XVY8ZmGEZEXcC3CaSKShatYEQWgqo/iBmKfBawDioGrvGO7ROTPuNKfAHdVDeIzxtTPH1DKKv2UVwYor6xKWN26S2r9lPsD1cfL/QFKyv0UllVSVOanuLzSW6+kqNzvXmutl1a465pSbFQEyXHRJMdHkRwfRUbHRG89muS4KFLio6u346N9+CKECBEixHVBixC8bUHEfbm/13btB0rtzb13uPvXfe+IoH0iTdMFLkySZK8lqSgbUvuFNhZjWrHp06eTmZnJsGHDOOOMMzj77LO5/fbbSUlJYc2aNfzwww+ce+65bN68mdLSUm644QamTZsG1LTsFhYWMmHCBE488UQ+++wzunXrxn/+8x/i4uKYOnUqEydO5MILL6R3795MmTKFN954g4qKCl566SUGDBhAdnY2l19+OVu3buX444/n/fffZ+nSpfttMZ45cyazZ88G4Be/+AU33ngjRUVFXHzxxWRlZeH3+7n99tu55JJLmD59OvPmzSMyMpKf/OQn3H///c3ys21OqnrZAY4rcG09x2YDs5siLmNaClWluNxPntdyml/iWkx3F1etl1NY5qe0wk9JuZ/SyqrXAKXB2xX+RkleYyIjSIyJJCEmkvhoH4kxkSTHR9M9xW0nxEQSF+0jNtJHTFQEMZERxET6iI6sWo8gJspXsx7pI8onRAQlsRFStc1eiabPSzxjoiKIjfI10k84PIRJklzVkmwjrE34uPONlazaWtCo9xzUtR13/HRwvcfvu+8+VqxYwTfffAPAxx9/zLJly1ixYkV1qbPZs2fToUMHSkpKOPbYY7ngggtITU3d6z5r167lhRde4IknnuDiiy/mlVdeYfLkyfs8Ly0tjWXLlvHwww9z//338+STT3LnnXdy6qmncuutt/LOO+/wr3/9a7/vaenSpTz11FN8+eWXqCqjR49m3LhxrF+/nq5du/LWW28BkJ+fT25uLq+99hpr1qxBRMjLyzuon58xpvXILSxj5dYC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","text/plain":["<Figure size 864x288 with 2 Axes>"]},"metadata":{"needs_background":"light"},"output_type":"display_data"}],"source":["#plot performances\n","plt.figure(figsize = (12,4))\n","plt.subplot(1,2,1)\n","plt.plot(history['loss'], label=\"training loss\")\n","plt.plot(history['val_loss'], label=\"validation loss\")\n","plt.title('Lossfunction:')\n","plt.legend()\n","\n","plt.subplot(1,2,2)\n","plt.plot(history['accuracy'], label=\"training accuracy\")\n","plt.plot(history['val_accuracy'], label=\"validation accuracy\")\n","plt.title('Accuracy:')\n","plt.legend()"]},{"cell_type":"markdown","metadata":{"id":"evTrEUKAgwwo"},"source":["### 8.2. Prediction on the **Original Test set**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":7511,"status":"ok","timestamp":1662195482194,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"30bpky_XjoB-","outputId":"be986847-44ad-44aa-9cd2-567657b595dc"},"outputs":[],"source":["# Training set data augmentation\n","signals_test_aug, labels_test_aug, RRfeatures_test_aug, original_idxs_test = Dataset_Augmentation(\n","    signals_test, \n","    labels_test, \n","    RRfeatures_test,\n","    NSR_len=len(signals_test)\n",")"]},{"cell_type":"markdown","metadata":{"id":"4tkjOod3gwwo"},"source":["Predict labels for the test set"]},{"cell_type":"code","execution_count":197,"metadata":{"executionInfo":{"elapsed":17471,"status":"ok","timestamp":1662203956007,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"0mOC4T1-gwwq"},"outputs":[],"source":["pred = resNet_deep_wide_model.predict([signals_test_aug, RRfeatures_test_aug.astype(\"float64\")])\n","predicted_class = np.argmax(pred, axis=-1)\n","\n","y_pred = np.zeros((predicted_class.size, predicted_class.max()+1))\n","y_pred[np.arange(predicted_class.size), predicted_class] = 1"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":36,"status":"ok","timestamp":1662203956008,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"4qYRgsfYRe_c","outputId":"888ec9e1-1dfe-44f6-9319-996d5c86389b"},"outputs":[],"source":["# One hot encoding of test labels\n","labels_test_onehot = tf.keras.utils.to_categorical(labels_test_aug, num_classes=3)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":32,"status":"ok","timestamp":1662203956008,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"A_D9No0meTqc","outputId":"682c808e-3e33-471e-f215-458767c8986e"},"outputs":[],"source":["cm = sklearn.metrics.confusion_matrix(np.argmax(labels_test_onehot,axis=1),np.argmax(pred,axis=1))"]},{"cell_type":"code","execution_count":204,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":523},"executionInfo":{"elapsed":302,"status":"ok","timestamp":1662204012785,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"uzwQKTlzeTqd","outputId":"2fbf6f50-e2fe-4fd1-9d0d-1b856a04eb03"},"outputs":[{"data":{"image/png":"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","text/plain":["<Figure size 720x576 with 2 Axes>"]},"metadata":{"needs_background":"light"},"output_type":"display_data"}],"source":["cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n","\n","fig = plt.figure(figsize=(10,8))\n","sns.heatmap(cm.T, xticklabels=list(classes_names), yticklabels=list(classes_names),\n","            cmap=\"Greens\", annot=True, fmt='.2f')\n","plt.xlabel('True labels', fontsize=16)\n","plt.ylabel('Predicted labels', fontsize=16)\n","plt.title('Confusion Matrix - Data Augmentation (known labels)', fontsize=20)\n","plt.show()"]},{"cell_type":"markdown","metadata":{"id":"hdthx3sTe0_E"},"source":["Compute standard metrics"]},{"cell_type":"code","execution_count":203,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":345,"status":"ok","timestamp":1662203975292,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"HjrFCwKQe0_E","outputId":"dfa2d6e3-f0b8-49a7-9443-76ae92bc3ea3"},"outputs":[{"data":{"text/plain":["{'0': {'precision': 0.9891308246941923,\n","  'recall': 0.9919775515343382,\n","  'f1-score': 0.9905521428314833,\n","  'support': 27797},\n"," '1': {'precision': 0.9629889817348222,\n","  'recall': 0.9544488419818236,\n","  'f1-score': 0.9586998932528435,\n","  'support': 27288},\n"," '2': {'precision': 0.9596442717285704,\n","  'recall': 0.9654887218045113,\n","  'f1-score': 0.962557625276414,\n","  'support': 26600},\n"," 'accuracy': 0.9708147150639652,\n"," 'macro avg': {'precision': 0.9705880260525283,\n","  'recall': 0.9706383717735577,\n","  'f1-score': 0.9706032204535803,\n","  'support': 81685},\n"," 'weighted avg': {'precision': 0.9707957457989136,\n","  'recall': 0.9708147150639652,\n","  'f1-score': 0.9707952920820585,\n","  'support': 81685}}"]},"execution_count":203,"metadata":{},"output_type":"execute_result"}],"source":["metrics = sklearn.metrics.classification_report(y_true=np.argmax(labels_test_onehot,axis=1),\n","                                                y_pred=np.argmax(pred,axis=1),\n","                                                output_dict=True)\n","metrics"]},{"cell_type":"markdown","metadata":{"id":"XJ7gVv1lmoF6"},"source":["Average prediction returning to the original samples"]},{"cell_type":"code","execution_count":205,"metadata":{"executionInfo":{"elapsed":348,"status":"ok","timestamp":1662204048838,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"LFidRDwNnMm-"},"outputs":[],"source":["def Test_Time_Majority_Voting(pred_labels, original_idxs):\n","  i = 0\n","  n_test = len(original_idxs)\n","  pred_classes = [] # store majority class for each sample\n","\n","  # Iterate over the samples:\n","  pbar = ProgressBar()\n","  for idx in (np.unique(original_idxs)):\n","    curr_idx = idx\n","    # print(\"Set curr_idx: \" + str(curr_idx))\n","    new_idx = curr_idx\n","    # print(\"Set new_idx: \" + str(new_idx))\n","    labels_temp = []\n","    # Check when index changes\n","    while new_idx == curr_idx:\n","      # Store new pred_labels\n","      labels_temp.append(pred_labels[i])\n","      # print(\"Labels temp: \", labels_temp)\n","      i = i + 1\n","      # print(\"Update i: \" + str(i))\n","      if i < n_test:\n","        new_idx = original_idxs[i]\n","        # print(\"Update new_idx: \" + str(new_idx))\n","      else:\n","        break\n","    \n","    # Majority voting over the stored labels\n","    val, cnt = np.unique(labels_temp, return_counts=True)\n","    dizio = dict(zip(val,cnt))\n","    majority_class = max(dizio, key=dizio.get)\n","    # print(\"MAJORITY CLASS: \" + str(majority_class))\n","    pred_classes.append(majority_class)\n","  \n","  return pred_classes"]},{"cell_type":"code","execution_count":206,"metadata":{"executionInfo":{"elapsed":901,"status":"ok","timestamp":1662204051974,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"UL9BuTK7yP5w"},"outputs":[],"source":["pred_classes = Test_Time_Majority_Voting(predicted_class, original_idxs_test)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":239,"status":"ok","timestamp":1662204057049,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"Lzf2JKXTy_US","outputId":"40267352-c91d-423e-a9f6-3a6af435cf5b"},"outputs":[],"source":["cm = sklearn.metrics.confusion_matrix(labels_test,pred_classes)"]},{"cell_type":"code","execution_count":208,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":523},"executionInfo":{"elapsed":656,"status":"ok","timestamp":1662204066524,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"iufbZ6Aly_US","outputId":"0fb3c31d-69c6-4c61-8586-bd2864a240d9"},"outputs":[{"data":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAkMAAAH6CAYAAAAEFEi7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd5wU9f3H8dfn7lBRmu1AKRZEE8SW2BtgoVhoGgWNUWNNNPqLDVGjWCK2JHYjRkSTKBorGARURKJYIEYROyoiSLNgRcrx+f3xnT329nbvbmEbc+8nj30cO/Pdme/uzsx+5vP9znfM3RERERFprMqKXQERERGRYlIwJCIiIo2agiERERFp1BQMiYiISKOmYEhEREQaNQVDIiIi0qjFIhgys7PM7G0zW2Jmbmb/V4B1zjKzWfleT2MQfWeTil0PkVJnZt2i/WVoseuSyszWMbMPzGxsyvShUZ27FalqJc3MTog+nxPWcDl5/5zXtK5mdrOZfWVmm+S4amssq2DIzH5iZreY2Qwz+9rMlpnZZ2b2bzM7yczWzVdF66jTQOAm4EfgRuBy4OVC16MURAGaR48D6ih3T1K5oWu4zpI9OK+JpANL4rHSzL4xs0/MbKyZDTaztjlcX1GCazO7K3p/P5hZq0Kvf22Xqx+ypOVtGS1vZC6WV2BnAdsAlxS7IlKyrgbWBYYWuR61VDS0oJldClxGCKBeAu4FvgNaA92AvwG/AXbNeS3rdljir7t/VsD1HljAdWVrBXAyMDF1hpm1AI6KyjT4+8+znwI/FLsSGTwPTIr+vwGwGbAP0Bu43MyGuvs1RarbGjGz5sBAwIGmwC+BW4taKanPq4T95fNiVySZmW0AXAw87e6vFbs+UprcfX4U6J9mZte5++xi1ymhQT+GZnYRIePyKfALd38lTZnDgHNzW70G2RygwIEQ7v5hIdeXpSeBAWa2sbt/kTLvWGB94DGgf8Frloa7v1vsOtRhkrsPTZ5gZgYMAIYDw8yMtTQgOgZoBvwZOBM4BQVDJc3dfwBKcX85BmgFjCxyPaT03UtInJxKKWUR3b3OB7AlsCx6dKmn7Lppph0FTAa+BpYAbwJDMpSdFT02AK4HZgNLgZnAYMCSyg4lnNHWeiTV24GRGeo6KVE2aZoBxwNTgEWEprdPgfHA0enqmu4zAC6M3ucPwDfAf4CjMny2TjiAbAmMIpzx/QhMI2S76v2OUurkwCHR3/9LU+a16HM9NSozNGX+tsA10foXRZ//J4Qf/nYpZUdm+g6AblGZE6LnJwC9os/96+TPPpo/Ken5VsBi4Etgi5R1bgC8A1Ql1pGPR9L2NbSOMt2jMj8AmyVNX4cQXIyNPrul0Xt5BuidsoxudXyGI5PK9QP+AbwPfB89/ktomihbzfc4Lfoc2wMPR+vco6H7S9K86u84zbyewItRfb8EHgd+krTtbJlhf+gY1ekL4FtgAtHxB9g02h7nEfaVqUD3DHWrAH5LaDr/Jvqu/hd9P2UpZZPXvyX17I+JzyTDY8uozObApdFnMJ9wHP0MuB/onGGbS/c4IWV7qbVdAp2A+4C5Seu5D+hUx/bdDTiSkHH6IfqORgFts9yWXiZs5+vXta6U6R2At6K6Hpc0fRYN/B1IWV6DfmsILRvLgA1Spj8f1fPulOk/jabfl4/Pjwz7D+H4Mhx4m7DtLgFmEFpo1qvnOz2esJ0vARYCI4A2Gda/ETCMcFxdEn1+zwI9sqjrjsAD0fe2lPDb8Rqh60qTNMv5ONo+036XxXg0JDN0ItAEGOXuM+oq6O5Lk5+b2dWEjfFzws7/HaF54Wqgp5n1cPdlKYtpQgg+NgeeIjTn9CP8QK9HyFDBqqaLE4AtkqaviT9G9f0YeIiwUWwG7Ab8Aniwrheb2TpR3bsSzt5uI2RhjgQeNLOd3f2iNC/dgrAzfQT8nbBxHg08YWYHuftzWb6Ppwkb5cmEjTFRv58DuxA+q5UZXjsAOB14jhAULgO2j5Z1uJnt6u5zo7KPR3+Pp2ZzEtH6kx1JCIaeAv5KeM9pufvHZnYy8C/gfjPr6u4rotm3E35Mh7r7pEzLKAR3f87MXgD2JXxut0WzNiL0Y5tC+C4WEbajw4GxZnaKu/8tKjuL8H0kOv1Xf1/A60n/v4bwnb1C+LFrCRwQrWc34Lhs6m5muwA/JzRrfBqlro8gBMm1Mr+rI+rPdz8hmHiIELzsTfgxeqOOl24Z1eEdVgUm/YFJZrYXMI7w4/Ag4bMeCDxlZtt6UtrdzJoAYwgB2XtJdekO3ALsQfrPraH740hC0N4XeIKa39fi6O/+hJOj54BHCMfAToT9oY+Z7ePuic9iEiG7cnb0+TyetLzkZddiZrsRgu3mwGjCD+hPCE2ffaN6T03z0t8CfaLXPB99JkcDO0XHq6VpXpO67paE7hFTPWSu6mVmOxFOFpoDh7j7MylFGvo7kFheNr81zwJ7AvsRtiXMbP1oGtTuAnFg0utSrfHnV4fBhO9wCvBvwvvehxD0dIu+06o0r/s90IOwf4wjHJ9OjF6zh7svShQ0sy0I292WhJP2cYQg9DBgnJmd5u531VVJM9uRsL864XP4GGhB6D/2W0L2Z3nKy14ktFJsTwjwiq8BUeuzhDd5cjZRFrBX9LrZJEWkhDO1MdG8i1JeMyuaPhZomjS9knBwWUxKlEmGM1ZWLzP0BTCH9Gc3m6Sp66yUaUOS6l+RUv/Ee9s7TR0duCxlWT0Ty8riM0+so4KwATqwV9L8vxIyAR0IwU2tM0ygLemzdj2i196RMr1buuUkzT8hmr8S6JWhTI3MUNL026N5w6Lnx0fPJ7Ka2ZAsPsuhdb2vpHJXRuXuTZq2LilZtGh6S8KO/2Xy9p1pe0qZ3zHNtDJCyjljRqeO5f01et2g6HkFIVj5DmjRkP0lzXd8QtK05sBXhLPEnVLKX5O03W+ZYX+4OOU1f4imfxnVvSxp3nHRvL9k+A5vAcqTppcDd0fz+mZY/2Upy0q7P6Z77ynzK4HmaabvFH3WT6VMT9RhZIbldUvdLgkZ7Xei6cemlD86mv5uymeW+Gy+AXZIec390bxa2ewMdeqV+Jzr2Ze6Rc8PIpxofpa6bSTtCw3+HSDL3xrCSYQD16f5fidEfzsmzXssmtY+T59f2m0I2Jo0mRNWHXNSWysSdVoG7JIy7y+kz3pNIhybB6ZMb0UIwJcArevZ1/9Eyr6UNG9D0hyrCQG/A79tyGdUiEdDribbLPo7pwFlk/06+nuVu89PTPRwhn9u9AWcnOG1Z7n7kqTXLCScebUEtsuyHtlaTvjRr8HdG9Jh8deEL/gcX5XJSNT/yuhpuvf8CXBVyvrGE3bu3RtW7VruIbyPU6C6g+MxwHivo9Oau8/1NGcz7j6BkNLuuZr1ecLdx2X5mnMIZ8iDzexMQuZlEeGAnymzVWiJLNmmiQnuvtTda+0v7v41IV29ISGb02Cepo9a9BncFD1t8PeStC18TTjQJ/bLfxLOCo/Npm4Z9CUcUP/pqzIfCVexKnOSzixCwJTs3ujvusD5Kd///YTMwc6JCWZWBvyO0DT1e086g47+fy5R8JBm/TnbH919obt/m2b6G4SgvnuUwVoTexMyCC+5+z9T1vMg8ALhuLlvmtfe7O5vpkxLZAIa+l47RH/n1VfQzH5JCHLmAnum2TaSNfR3INvfmimEDGFyBuhAwjZ0WdLzxHbUDfjA3T9NU8dcfH5puftHHkUOKf4S/c20z//d3f+XMm0oYX8/JnHVd5Sd6wo84u6jUta9mKg5jpAxboglqRPc/asMx+rE99QhzbyiyOfVRD+L/ta6osnd3zezOcBWZtYy+pFI+NrdZ6ZZXmJD3DDH9Uz2T8IB9G0ze4iQ9nwppX5pRVfmbAPM9fQdghOfwy5p5r3u6dOdnxLOerLm7nOj8T6OMrOzCe3pzVm1o6YVdQ4+lnAGsBPh8y5PKpLarNlQr2b7Anf/0cyOJvTXuIXw43Wku9d70AWILhVPN+bUjdHOngsW/a1x0DKz7YHzCc0kmxEOKsmyuizfzDaOlncI4YxxgzVY3kDCtnCnu/+YNH0k4cfjFOCObOqXRmI7fyF1hrt/Z2avE35k0km3PyQukHg/Nbhw9yozWwC0S5q8LaF56wPgkrBZ17KE0B+kIeuH1dwfzexQQtPzrsAm1D7ubkIDAok6ZDzWJk3fl/CdTE6ZNy1N+WyPtRtHf7+qp9zZhCD5RaCPu9dVPpvfgax+a6LjyhRCIJq4yOQAQjPfS9G2dCChv87PCEF9pi4Sufj80opOWs4mNBFvS9hnkzfkTPv886kT3P3raJ/rStjmX2fVttwyw9AoiRO8dPtIsgejej5uZg8TmmtfTHcCl+TL6G/JjDfUkGBoHuHDyHZMlZZJr8+03A6EDS052Mj0I5XItJRnmJ8Lvyf0EziR0M5/IbAiCirOzbBzJjTk/UJ4v6nqes9rMjDmXYR+KscQ3tN8Qtq4Ln8mBBDzCG32c1kV8Z9AHX196jG//iJpvQ9MJ5z9vk1IYzdUK1ad6SUbSd2ZiWxsHv1Nboffk3BgriA0M48mpNNXErIXfQkZjgaJgrqphI7lrxI6xX5J2D4SfUyyGePr1OjvyOSJ7j7DzP4L/DzqG5buQN9Qif1hQYb5maZDzeNBom4rooAm04nJCkI/k4TED3Qn0m8DCc3STMvZ/hidiNxICBSeJmSXfiAEz/0IJxxrOj5bro892R5rE8eH1IA/1f6EH/Nn6wmEMtUrU91W57fmWUIA1N3MniUEildH8yYCB0UnhnX1F8pUzzX+rYqyhRMJ2aUZhIBjEav63lxG5u0m076VOAYnPq/EPnJw9Mgk3T5Szd1fNbP9CEMrHEnUD8/M3gMud/cH0rysafS3VjapWBoSDL1A2GgOJLSzN1Rio2sDpIsQN0spl2uJ1Fym91jrwBCdDd4I3GhmlYSzqYGEztPbm9n26ZqQIsnvN518v990EunoSwhnzcOSm+9SRe/5LMLOt3fqGbiZDVqDuqRL9zbEhYRA6HNCZ7shhI7u9a/QfRY1z6TyoXv0N7nT8SWEnb27p3TyNrMhhGAoGycTAqHLvfZl/nsRgqEGiTo7JtL3L2XImEAImJKDoZXR6yvSbEPpfmS/if62zrD8TNNzJbGfPebuA/K8rrTMrILQPDEf+FlqRjP67nKh2MeehdHfjessBScR9ufLzKzM3S/N0fpX57cmkUU6iLBtl7Eq4JkIDCIEqgcSjl3P5aiuDdWXsJ+OdPcTk2eY2WbUHeBn2rcS28fXKX/PdvebV7eiAO7+EnBY1AT3c0I/st8RLoBZ5LU7yCe2lYWUiIac5dxDiEaPMLPOdRW0miNQJ9osu6Uptw3hx/njHDZXpEqcebRPs/4WhLRjRlFb/6PufhRh5+gIdKmj/LeEHbGtmXVKUyTxo1mwAcmi4G4E4bN2wsCYddmasE1MSBMItYvmp0o0J+Q8Y2dmewNXEK4E6hL9vdzM0vV9KDgLo3zvQzi7eSxp1jbAl6mBUKRrhsVVkfkz3Cb6+0gWy8skkRWaRDi5SfdYAgwys+Qzwoz7E+kHWk3s/7W+q2i5O6dOz7F3CWfte+agT05d6tr+NyEEilPSBELNWNW809DlZZLxWBvJ97FnevT3J/WUW0zIQPwH+IOZXZej9a/Ob81UQsB+IOFkfwnhKkdYFRQdQti/pzewz2guJfb5R9PMq2+frzU/uuJvZ0JfqXeiyYk7Ney3OhVMJ+ovOSUKdM+KJqc7+UtsK3VeJVlI9QZD0dn1UMLYKf82s7QjTJtZ4rLphBHR30vMbNOkcuXADdG6s8k0ZSX6MX8X2Cc5iIvW/2dWpekS09c1s31SlxMdSDeKntZ32egIQibi+mg9iWVsQrgaJlGmkG4mtDn3dPeP6ik7K/q7b0r9mxGa3NJl2RKDOua0I5yZbUgYt6KKcKXDAsKVMSsIZxsb1fX6fLJgAOHSfwhXHiU3A84CNoqyMMmvO4nMnR6/ADY1s6Zp5s2K/nZLWd4uhExZQ+vdlNAfrIrQCf3kdA9C0NWMcHackOjzdUrKMg9MKZfwBOHM89ioo2ayS0ifTcqZKHt1CyErcHO6z9XMNqvvBK8B6tr+FxKOGT9PDiyjY8pNpO8v8RXhxCWb/elFwonCvmZ2ZPKM6Pl+hObmWv23cuQtQhPOnvUVjI7LvQgBx/lmdlM9L2mIrH9rohPFyYSg4xfAC4msv7t/TNjnziYMjZKpL1Y+zYr+dkueaGZbA9fW89rjomNDsqGE5rEHkt7nNEJgOsDMfk0aZrZD1GKQkZntneG4lchQpfvd3JNwHErtw1Y0DepA7e5XRynfy4CpUeezaay6Hcf+hLb5aUmvmRJF/hcAM6KOVd8Txn7oQtgxr8/he0nnesJO8KKZ/YtVY4w0IVyllHyQbgq8YGYzCYPZfUJoAz+Y0GdqtLu/Q91uILy/vsAbUV+j9Qk7WyVwnbvn64CUVnRG83i9BUPZ+WY2itA0+LqZTSDsQAcTPrvXqX1G/x6hKW6gmS0nfG5OuKLhkzWo+gjCD8JZ7v56VL83zOxcwijJIwnje+Rbt6TOhU0JfYT2ITRbLQUGu3vqdnwjIeh5IeqI/zUhe7IvYSDBI6ntWcIVZuPMbHK07DfcfQyhj9D5hObb7oROwZ0IY4E8SggSG+JoQhAyxusesf1vhPFpTmVVh/t7ojoMiYKbtwnZ1d6ErFiNK07c/RszO4MwTs+U6HNIjDO0E6GTZ1cyj3eVC1dG6zqdMEbWRMK2Wkn4/PYh9HN4ew3W8RLhYP9/USf3RFB8S9Rp9WaiQVjN7AnCSWV3wgnWc6zK2gDVnctfAfYzs38SgpgqwvFnOmm4u5vZ8YQ+SQ9G63mXcMVVP8Kglb/KcFXPGovW/xhwatSV4K16yv9g4Y4FjwBnmdl6wOkZrpxqyPpX97fmWcI+VEntPkHPEpr1SDOvEMYQBpk8x8x2IGS/OhDq+2/qDpafIvzmJfa5faPHLMK2mOwYQrB3t5mdRWjuX0zIpu1I+Pz2ou7mrAuAA8zsP4Qxhr4jdGnoTQjuhycXjrJUuxP6jhWy20jdPIvr8AlBwS2EPiXfEK4smkf48E8i/fg0Awkb47eEH9S3CAegdCNoziLDWCtkHsV0EhnGP4nmnxStcynhQHUnob2yxusIAdIF0XuZHdV1ESGVeDqwTkPqSgigLoo+oyXR+36BaDyXlLJbkuVYSPV8P7Oi5VU0oGymcYbWJ/TJmcmqEbhvS/eZJb1mN8IB42vCj1vymCInUMc4LFEZp+YI1L+Lpj2Rofyj0fzfZ7P9ZrmtJ7a3xGNl9F1+QuiLNZg6RpklHLRejl6zmNDxe/9Mnwfh6rA7CENYrEjdLoDOhI7YC1k1+vTJ9W1DKet4MSrbpwFl34vK7pw0bfvovX9LOOBNIgQ0Gb9jwgFxCiFg+IqQMfoJ4ZYxDrTKYn+osZ00cH80QofOZwmdzpcRAqIXCPtp+yzWn2n770UIir5L2l62jOZVEIaIeJtwPJhPCBC3IM0o3NFrtiH8GH7Bqv3phGheN9Lst9G87aJlzyN0bZhHGLV8uzq2725p5jV4m0p6zU7Ra65t6LoIgWFiXx5JNB5Npu+yAfVu8G9NVH6HpO9rt5R5g6Lpy0k/TlTOPj8yHxPaE65wTlzE8hbhN6qCNPtCcp2iZSbGCVpEOJnZLMP6mxP2hf8StuElhKDm34QTog3qqithDLp7CNv414Tj03uEVokt0qwvcfeDfg3dvgrxsKhyIiIFETVffEQ4wdisvvKydjCz8YRswtaeND6QSDIzm0Zoht/e0w9hURRrctm2iEhGZtbKwm0OkqcZoc9QB2p2Ope133mEsWl+W+yKSGkys36Eq83OK6VACPI76KKING57EvqwTCA0fTSLpu1MaH4dWrSaSc65+5tRR9zmxa6LlKymhO4NTxa7IqnUTCYieWFmWxFua7EPIWNQQegT9SRwtYcrBEVEik7BkIiIiDRq6jMkIiIijVps+wzZwe2U8pKcWTLu/WJXQUSkTuuVr5/v2w/VkK/fWX96TkHfBygzJCIiIo1cbDNDIiIikkeZb/S81lFmSERERBo1ZYZEREQkezFKp8TorYiIiIhkT5khERERyV6M+gwpGBIREZHsxScWUjOZiIiING7KDImIiEj2YtRMpsyQiIiINGrKDImIiEj2YpROUTAkIiIi2VMzmYiIiEg8KDMkIiIi2YtPYkiZIREREWnclBkSERGR7JXFJzWkYEhERESyF59YSM1kIiIi0rgpMyQiIiLZ06X1IiIiIvGgzJCIiIhkLz6JIWWGREREpHFTZkhERESyp0vrRUREpFGLTyykZjIRERFp3JQZEhERkezp0noRERGReFBmSERERLKnDtQiIiLSqMUnFlIzmYiIiDRuygyJiIhI9tSBWkRERCQelBkSERGR7MUnMaRgSERERFZDjK4mUzOZiIiINGrKDImIiEj24pMYUmZIREREGjdlhkRERCR7Mbq0XsGQiIiIZC9GbUsxeisiIiIi2VNmSERERLIXo2YyZYZERESkUVNmSERERLIXn8SQMkMiIiLSuCkzJCIiItmLUZ8hBUMiIiKSvRi1LcXorYiIiIhkT5khERERyV6MmsmUGRIREZFGTZkhERERyV58EkMKhkRERGQ1lMUnGlIzmYiIiDRqygyJiIhI9tSBWkRERCQelBkSERGR7MUnMaRgSERERLJnaiYTERERiQdlhkRERCRrygyJiIiIxIQyQyIiIpK1GCWGlBkSERGRxk2ZIREREclaWYxSQwqGREREJGvqQF1EZtah2HUQERGR+CjZzJCZ7QW0BSa7+0Iz2xG4ENgPaF/UyomIiDRyygzlmZldD4wAjgD+bWZXAROAV4BOxaybiIiIxEupZoYOBXZx9x/NbEPgU6CLu88qbrVEREQElBkqhB/d/UcAd/8K+ECBUPZ67tqNd0c8zwcjX2Dw0WfUmt+hsi3PXDeKN+58mudu+BdtN9mset41J1/Em8Of4c3hz3BU18MLWW0pYS/+50X6HNKPw3r24e67RtSav2zZMs4/ZzCH9ezDsUcfx9y5n1XPu3v43RzWsw99DunHiy9MKWS1pURpe1q7meXnUQylGgxtbWajEw9gq5TnUo+ysjJu+91V9L7oODqf3J1B3fvy0w41WxhvOO0P3Pf0w+x02sFc8Y+/MOykCwE4ZPcD+Nk2Xdj59J7scdbhnPeL02i+frNivA0pIVVVVVx91TXcfuetPDbmEcaNHceHMz+sUeaxRx6nRYvmPDl+NL88/lhu/NNNAHw480PGPTWeR8c8zO3Db+PqK4dRVVVVjLchJULbk5SSUg2G+gJ/SnqkPpd67L7dzsz8bBYfz5/N8hXLGTXpCfru3aNGmc4dOjHx9RcBeO71KfTdK8zvvMW2TH7zFapWVvHDj0uY/tG79Nq1W6HfgpSYGW/OoH2H9rRr344m6zShV++eTJo4qUaZ5yZOok+/kEk8uMdBvPryq7g7kyZOolfvnqyzzjq0a9eW9h3aM+PNGUV4F1IqtD2t/cwsL49iKMlgyN2fT34AU4BvgHei51KPtptsxqeL5lU/n/P5/BrNYABvfPQOA/Y9BID++/amxQbN2ah5K9746G167daNpuuux8YtNqT7znvRvnLzgtZfSs/CBQtp06Z19fPKNq1ZsHBRmjJtAKioqKBZ82YsXryYBQsX0TqaDtC6dSULFywsTMWlJGl7klJSkh2ozeyvwC3u/paZtQReAqqAjczsPHd/IMPrTgVOBeAnraDdBoWq8lrpvOFXcuuZV3FCj18w+c1XmLNoHlUrV/L0fyez23Y7MeWmJ1i0+Ateevs1paBFRKQGdaDOv/3c/a3o/ycC77v7DsDPgQsyvcjdh7v7ru6+a2MPhOZ+Po/2m67KBLXbpA1zP59Xo8y8LxZwxOWn8LPf9OLiEdcC8PX33wBw9f23sMvpPelx4TGYGe/P/bhwlZeSVNm6kvnzF1Q/Xzh/Aa0rN01TZj4AK1as4Ltvv6NVq1a0rtyUBdF0gAULFlLZurIwFZeSpO1p7Wd5+lcMpRoMLUv6/8HA4wDuPj99cUk19b036NR2K7Zs054mFU0Y2K0vo196ukaZjVtsWB3ZDxl0JiPGPwiEztcbNW8FwA5b/ZQdt/oJE6apdbKx277L9sz+ZDZz5sxl+bLljHtqPF27d6tRplv3rox+fAwAT094ht332A0zo2v3box7ajzLli1jzpy5zP5kNl126FKEdyGlQtuTlJKSbCYDFpvZYcBcYB/gJAAzqwCaFrNia4uqlVWceesfGD/sn5SXlTFi/IO8/cn7XH78eUx7/w3GvPQ03Xbam2EnXYi7M/nNVzjjlosBaFLehP/85VEAvvnhO3557VlUrVQzWWNXUVHBkIsH85tTfsvKlSvp178v23TqyG233M7223em2wHd6H9EPy4efAmH9exDi1YtuO6GawDYplNHevTsQf/Dj6C8vJyLLrmQ8vLy4r4hKSptT2u/ODWTmbsXuw61mNm2wM1AG+BGdx8ZTe8J9HD3c+tdxsHtSu+NyVprybj3i10FEZE6rVe+fkGjkxZD9sjL7+w3w14peJRVkpkhd38f6JVm+nhgfOFrJCIiIslilBgqzWDIzC6tY7a7+5UFq4yIiIjEWkkGQ8D3aaatD5wMbAwoGBIRESmishilhkoyGHL36lGmzaw5cDbwa2AUGoFaRESk6IrVgdrMegE3AeXA39z9mpT5HYB7gVZRmQvdfWxdyyzVS+sxs43M7CpgOiFo+5m7D3Z3DTMqIiLSCJlZOXAb0BvoDAwys84pxS4BHnL3XYCBwO31LbckM0Nmdj0wABgO7ODu3xW5SiIiIpKkSJmh3YGZ7v5RVIdRhPuXvp1UxoEW0f9bAp/Vt9BSzQydC2xOiO4+M7Nvose3ZvZNkesmIiIixdEW+DTp+ZxoWrKhwC/NbA4wFvhdfQstyWDI3cvcvam7N3f3FkmP5u7eov4liIiISD6Z5ethp5rZtKTHqVlWbRAw0t3bAYcAfzezOuOdkmwmExERkdKWr2Yydx9O6CaTzlygfdLzdtG0ZCcRjVXo7mJQR5QAACAASURBVC+Z2XrAJkDGPsclmRkSERERSWMq0MnMtjKzdQgdpEenlJkNHAhgZj8F1gMW1bVQZYZEREQka8XoQO3uK8zsTMLdKMqBEe7+lpldAUxz99GEfsd3mdnvCZ2pT/B67j2mYEhERETWGtGYQWNTpl2a9P+3CTd5bzAFQyIiIpK1ON21XsGQiIiIZC1OwZA6UIuIiEijpsyQiIiIZC1GiSFlhkRERKRxU2ZIREREsqY+QyIiIiIxocyQiIiIZC1OmSEFQyIiIpK1shgFQ2omExERkUZNmSERERHJWowSQ8oMiYiISOOmzJCIiIhkTR2oRUREpFEz4hMMqZlMREREGjVlhkRERCRrcWomU2ZIREREGjVlhkRERCRrccoMKRgSERGRrMUoFlIzmYiIiDRuygyJiIhI1uLUTKbMkIiIiDRqygyJiIhI1pQZEhEREYkJZYZEREQka3HKDCkYEhERkazFKBZSM5mIiIg0bsoMiYiISNbi1EymzJCIiIg0asoMiYiISNbilBlSMCQiIiJZi1MwpGYyERERadSUGRIREZGsxSgxpMyQiIiING7KDImIiEjW4tRnSMGQiIiIZC1OwZCayURERKRRU2ZIREREsqbMkIiIiEhMKDMkIiIiWYtRYkiZIREREWnclBkSERGRrMWpz5CCIREREclejIIhNZOJiIhIo6bMkIiIiGQtTs1kygyJiIhIo6bMkIiIiGQtRokhBUMiIiKSPTWTiYiIiMSEMkMiIiKSNWWGRERERGJCmSERERHJWpwyQwqGREREJGsxioXUTCYiIiKNmzJDIiIikjU1k60Ffhj3XrGrIDHStN9Pi10FiZlvH51e7CpI3JQXuwJrr9gGQyIiIpI/ccoMqc+QiIiINGrKDImIiEjW4pQZUjAkIiIiWYtTMKRmMhEREWnUlBkSERGRrMUoMaTMkIiIiDRuygyJiIhI1uLUZ0jBkIiIiGQtTsGQmslERESkUStYZsjMNnb3Lwq1PhEREckfZYbqYGanmNn5Sc93MLM5wEIzm2ZmbXK9ThEREZHVlY9mst8BS5Ke/xlYDPwf0BK4Ig/rFBERkQIyy8+jGPLRTLYF8C6AmbUEugL93H2smX0BDMvDOkVERKSA1ExW/zJXRv/fF3BgUvT8U6AyD+sUERERWS35CIY+AA6N/j8QmOLuP0TPNwe+zMM6RUREpJBi1E6Wj2ayG4C/m9nxwIbAL5LmdQem52GdIiIiIqsl58GQu99vZrOBPYCp7j45afYCYHSu1ykiIiKFFac+Q3kZZ8jdXwBeSDP9snysT0RERAqrLD6xUG6CITPrkE15d5+di/WKiIiIrKlcZYZmEa4aa6jyHK1XREREikDNZLX9muyCIREREZGSkJNgyN1H5mI5IiIisnYoi1FmKG93rTezMjPrYmZdzWyDfK1HREREGg8z62Vm75nZTDO7MEOZo8zsbTN7y8zur2+ZebmazMzOAC4DNiE0n+0GvGZmjwMT3f3mfKxXRERECqMYfYbMrBy4DTgYmANMNbPR7v52UplOwBBgH3f/yszqvfNFXu5aD9wEPA4cBSR/Wv8Bjsj1OkVERKSwyvL0qMfuwEx3/8jdlwGjgL4pZU4BbnP3rwDcfWFD3kuunQP8yd1PBR5LmfcusF0e1ikiIiLx15Zwn9OEOdG0ZNsC25rZi2b2spn1qm+h+Wgm2woYn2He90CrPKxTRERECihfHajN7FTg1KRJw919eBaLqAA6Ad2AdsBkM9vB3RfX9YJc+xzYMsO87YC5eViniIiIxEAU+GQKfuYC7ZOet6N2XDEHeMXdlwMfm9n7hOBoaqZ15qOZ7EngUjPbOmmam9kmwO8JfYlERERkLWZmeXnUYyrQycy2MrN1gIHUvufp44SsEFHssS3wUV0LzUdm6BLC3elnAK8Qria7GfgJsBC4Ig/rFBERkQIqxjhD7r7CzM4kdMcpB0a4+1tmdgUwzd1HR/N6mNnbQBVwvrt/Uddy83HX+s/NbFfg/4CewIfRem4F/uLu3+R6nSIiItI4uPtYYGzKtEuT/u+Ei7nOaegy83XX+m+BK6OHiIiIxIzuTdYAZtYC6EK45G0OMCMKkkRERERKRr5GoL4UOBdoxqpBF781s+vd/ap8rFNEREQKJ2/38yqCnAdDZnY58Afgb4SRIRcArYFBwOVmVuHuQ3O9XhERESmcON2oNR+ZoVMII1CfnzTtLWCimX1NGEhpaB7WKyIiIpK1fGS5WpJ5BOpx0XwRERFZixVpnKG8yEcw9ArhLvXp7BbNFxERESkJOWkmM7PkoOos4DEzWwH8i1V9ho4Cfk3tu8uKiIjIWkZ9hmpbQRhpOsGAa6IHKdOn53C9IiIiImskV0HJFdQMhkRERCTG4pMXylEwpEvlRUREGpc4NZPFacwkERERkazlawTqdYDewHbAeimz3d11zzIREZG1WJwyQ/kYgXpz4AVgS0I/osSnldynSMGQiIiIlIR8NJNdDywCOhACoT2ArYE/AjOj/4uIiMhaLE6DLuajmWw/4Dzgs+j5SnefBVxqZuXAzWisIRERkbVanJrJ8pEZ2hj4zN1XAt8DGybNmwh0y8M6RURERFZLPoKhOcAm0f8/BHokzdsd+DEP6xQREZECsjw9iiEfzWTPAV2Bx4E7gdvMbGdgOdAzmiYiIiJSEvIRDF0CbATg7neYWQVwNLA+cB1htGoRERFZi8Wpz1DOgyF3/xz4POn5LcAtuV6PiIiIFE+cgiGNQC0iIiKNWk4yQ2Y2Iovi7u4n5WK9IiIiUhzFGhMoH3LVTHYADb9rve5uLyIiIiUjV3et3zIXyxEREZG1g/oMiYiIiMREXu5aLyIiIvEWn7yQgiERERFZDWomExEREYkJZYZEREQka8oMiYiIiMSEMkMiIiKSNQ26mMLMVpLFYIruXp6L9YqIiEhxxKlpKVeZoStYFQwZ8GugKTAGWAC0AQ4DlgB317cwM9sN2MTdn0qZfgiwwN3/m6N6i4iISCOXqxGohyb+b2aXAJ8APd39h6TpGwDjgRUNWOS1wIlppr8F3EO4/YeIiIgUSZyayfKR5ToNuD45EAJw9++BG4DTG7CM5u7+SerEaNomOamliIiICPkJhjYB1skwbx1g4wYsY8M65q2fdY0aqRf/8yJ9D+nP4T37MOKue2rNX7ZsGRecM5jDe/bhl0f/irlzPwNg8eLFnHzCqez1830YdtU1ha62lKieP+vKu3dM5IM7n2fwkb+pNb/Dpm155qr7eePmcTx39SjabtwGgG477MX/bhpb/VjyyHv03bNHoasvJWjKCy8x4LAj6dt7APf87d5a85ctW8aF515E394D+NWgE/ksOkbNePMtBh1xLIOOOJaBA45h4jPPFbrqQri0Ph+PoryXPCxzGnC5mW2ePNHM2gJDgakNWMYzZvZHS8rBWXAFMDGXlY2rqqoqhl11LbfdeQuPjnmEcWPH8eHMj2qUeeyRx2nRogVjxo/ml8cfy01/ugmAdddZlzN+9xvOOf/3xai6lKCysjJuO/1Keg89ns5nHMSg/fvw0/adapS54dcXc9/ER9jprF5cMepmhh0/GIBJb77ELmcfwi5nH8IBFw/ih6U/MuF/k4vxNqSEVFVVcc1V13HzHTfx8OgHGT92PB99WPMY9fijo2nRojlPPPUoxx43iJv/fCsAHbfpyN8fvJcHHvknt9x5M1dfcQ0rVjSkB4bkkoKhup0FbA58ZGaTzOxBM5sEfEjoSH12A5ZxLrA1MNPMHjGzR4CZwLbRPKnHjDdn0L5DO9q1b0eTdZrQs3dPJk2cVKPMpImTOLzfYQAc1ONAXn15Ku5O0/WbssvPd2GddTMl+KSx2b3TzsycN4uPF3zK8hXLGTV5DH33OLhGmc4dOjFx+hQAnps+pdZ8gCP3OYSn/juJJUt/LES1pYS99eZb0TGqLU2aNKFH7x5MmlgzSH5+4vMc1vdQAA7scQCvvhIdo5quR0VF6PK6bOlSLFZ3yZJiyHkw5O7/A7YB/gRUATtEf28AOrn76w1YxvfuPgg4GBgZPQ5294GAjqINsHDBItq0aVP9vHWbShYuXJixTEVFBc2aN2Px4sUFraesHdpu3IZPP59X/XzOF/Oqm8ES3vj4HQbs1QuA/nv1osX6zdmoeasaZQbu14cHJj+R/wpLyVu4cBGt27Suft66dSWLFi6qUWZRUpmKigqaNWvG4sVfA/Dm9Bn8ou/RHN3/GIZcOrg6OJLCMbO8PIohL8MEuPsX7n6xux/o7p2jv5e4+xdZLucjdx8DPAlsZWZ3A3MylTezU81smplNu/uuEWv4LkQkG+eNuIquXfbktRvH0rXLHsz5fB5VK1dWz2+zYSU7bLkd419TE5msuR127MK/nniQv48ayci/3cvSpUuLXSVZi+UtlDazTYA9CR2mx7j7l2a2HrDM3VfW/erqZewJHAP0AzYCzgDOy1Te3YcDwwGWVH3f4EEg46iy9abMnz+/+vmC+QuprKxMW6Z1m9asWLGC7779jlatWqUuSoS5X8yn/SabVT9vt/FmzP1ifo0y875cyBHDTgNgg/XW54i9e/P1999Uzz9q30N57KXxrKhS3w6ByspNWTB/QfXzBQsWsmnlpjXKbBqVqT5GffcdrVq1rFFmq45b0XT9pnz4wYd07tK5IHWXoCxGzZM5zwxFHZ2vJ2RwRgMjgC2j2U8AFzdgGVeb2QfAH4HpwC7AIne/192/ynWd42j7Ltsz+5NPmTtnLsuXLWf8U+Pp2r1rjTJdu3dlzONPAvDMhGfZbY/dYjVuhOTO1A/eoNPmW7Fl6/Y0qWjCwP0PZ/SrT9cos3GLDau3nyG/OIMRzzxUY/6g/fvwwOTRBauzlLbOXTrz6ezoGLV8OROemkDX7vvVKNO1+/48+cS/AXh2wkR222NXzIy5c+ZWd5ie99k8Zn38CZu13bzWOkQaKh+ZoSHAmYRRqZ8GXkmaNwY4DriynmWcDLwP3EHIKi01s0ad6clWRUUFF148mN+ccgYrV66kb/8+bNOpI7ffcgedt+9MtwO60v+Iflw8+A8c3rMPLVq15NobhlW/vvdBh/L9d9+zfPlynnt2EnfcdTsdt9m6iO9IiqlqZRVn/vVSxl9+H+Vl5Yx45iHenv0Blx97DtM+mM6YV5+hW5e9GHb8Bbg7k996lTPu+EP167eobEf7TTfn+RkvF/FdSCmpqKjggovO58zTzqKqaiV9+x9Ox206csetd9J5+5/Stfv+9B3Qhz8MuYy+vQfQsmULrr7+jwC8/tobjLz7XioqKrCyMi685AI23FBZ7UKL08mzuec2xjCzj4C73H2YmZUDy4Fd3f01M+sF/MPd6xw4MXrdwcAg4EDgOeAgoL27NyjH3tibySS31u+n9Lvk1rePTi92FSRmmjVpWdDoZMhLF+Xld3bYXlcXPMrKR2aoLZDp9G8ZsEF9C3D3KmAcMM7M1iXc16wpMNfMnnX3Y3JVWREREWnc8hEMzQW6ELI5qXYCPq5vAVFH69MJl+hPB0a4+yNm1oLQmVpERESKKE7jO+Xj0vp/AZea2T5J09zMEgMmjmrAMu4FdgXeBA4hjFGEu3/j7vfluL4iIiLSiOUjMzQU2BuYTLh7PYQAqT0wBWjIza46u/sOANHYQq/mvpoiIiKyuuLUgTrnwZC7LzGzboTxgXoSbqPxBeEKsn82sAP08qTlrYjTBy4iIhIHxbqPWD7kZdDFqAP036PH6tjJzBKjtRnQNHpuYfHeIgfVFBEREcl9MGRmVcBe7l6racvMfg686u7ldS2jvvkiIiJSXJafO3oVRT7eSV15s3JA4/+IiIhIychZZsjMylgVCJVFz5M1BXoDn+dqnSIiIlIc6jOUwswuAy6NnjrwYh3Fb8/FOkVERKR44nRxU64yQ5Oiv0YIiu4m3Kg12VLgbeDJHK1TREREZI3lJBhy9+eB5wGiG6re5e6f5WLZIiIiUno0AnXdbgeapZthZtuaWZ03aRUREREppHyMM3Q78CVwWpp5vwc2Bo7Kw3pFRESkQOLUgTofmaF9gfEZ5k0A9skwT0RERKTg8pEZ2hD4OsO8bwiZIREREVmL6Wqyus0B9gCeTTNvD2BeHtYpIiIiBVSmEajr9DAwxMwOTZ4YPb8QeCgP6xQRERFZLfnIDF0B7A+MNrP5wFygLdAGeBm4PA/rFBERkQJSM1kd3P0HM+sKHAccTOgjNJPQefof7r4i1+sUERERWV35yAzh7suBEdFDREREYkaZIREREWnUymI0AnWubtT6EdDf3d8ws48JN2vNxN29Yy7WKyIiIrKmcpUZep4whlDi/3UFQyIiIrKWUzNZCnc/Men/J+RimSIiIiKFoD5DIiIikrU43ZssV32GfpVNeXe/LxfrFRERkeIwdaCuZWTK80SfIUszDUDBkIiIiJSEXAVDWyX9vx1wP/BvYBSwAGgNDAJ6R39FRERkLVZm8bk3Wa46UH+S+L+Z3QSMcvfBSUXeAyab2XXABUD/XKxXREREZE3lI6w7EHg6w7wJ0XwRERFZi5lZXh7FkI9gaCmwa4Z5uwHL8rBOERERkdWSj0vrHwKGmlkV8C9W9Rk6CrgMuDsP6xQREZEC0tVkdTsXaA4MA65Jmu6EjtXn5mGdIiIiUkBxGmco581k7r7E3Y8DOgMnAkOAE4DO7v4rd/8x1+sUERGRxsHMepnZe2Y208wurKPcEWbmZpap6061vI1A7e7vA+/na/kiIiJSPMVoJjOzcuA24GBgDjDVzEa7+9sp5ZoDZwOvNGS5eRkkwMw2MLOzzOxhM5toZp2i6QPN7Cf5WKeIiIjE3u7ATHf/yN2XEcYz7Jum3JXAtUCDWqNyHgyZWXtgOnA90AnoSuhDBNAdOC/X6xQREZHCKjPLy8PMTjWzaUmPU5NW2xb4NOn5nGhaNTP7GdDe3f/d0PeSj2ayPxEur98WmEvNS+mfJ1xRJiIiImsxy9MI1O4+HBi+Oq+1UKk/E/oqN1g+gqGDgVPd/ZOobS/ZXFIiOBEREZEGmgu0T3reLpqW0BzoAkyKBnBsA4w2sz7uPi3TQvMRDK0DfJthXktgRR7WKSIiIgVUpHGGpgKdzGwrQhA0EDgmMdPdvwY2STw3s0nAeXUFQpCfDtTTgSMyzOsN/DcP6xQREZGYc/cVwJnAeOAd4CF3f8vMrjCzPqu73Hxkhq4HHo7SU/dH0zqbWV/gJGC1KysiIiKloViDLrr7WGBsyrRLM5Tt1pBl5jwYcvdHzey3hNGnfx1Nvo/QdHamu4/L9TpFRESksIp1U9V8yHkwZGYtgXuAvwN7AZXAF8AUd8/Ul0hERESkKHIaDJlZBSHw6e/uY4Bncrl8ERERKQ1lMbpRa047UEcdmxYAVblcroiIiEi+5ONqsn8AJ+dhuSIiIlIiLIwWnfNHMeTjarJZwDFmNhV4ApgHeHIBdx+Rh/WKiIiIZC0fwdBt0d+2wM/TzHdAwZCIiMhaLF+34yiGfARDW+VhmSIiIlJC4tSBOh/B0PfAd+7+Yx6WLSIiIpJTOclxmVm5mQ01s68IV5N9Y2aPmFmrXCxfRERESos6UNd2OnApMIlwE7Wtgf7AN8CJOVqHiIiISM7lKhg6BbjL3U9LTDCz04Bbzew0d1+Wo/WIiIhICSjSXevzIlddwbcG/pUy7UGgHNgiR+sQERGREhGnZrJcBUPNCE1iyRL3IWueo3WIiIiI5FwuryZra2ZbJz0vT5q+OLmgu3+Uw/WKiIhIgenS+vQezjD98TTTytNMExERESm4XAVDumJMRESkEdEI1Cnc/d5cLEdERETWDrqaTERERCQm8nE7DhEREYm5Yl0Gnw/KDImIiEijpsyQiIiIZE19hkRERERiQpkhERERyVqc+gzFNhiKU/pOiu+bR6cXuwoSM80H7FjsKkjM+JhPCrq+OI1ArWYyERERadRimxkSERGR/IlTM5kyQyIiItKoKTMkIiIiWbMY5VMUDImIiEjW1EwmIiIiEhPKDImIiEjW4jSEjTJDIiIi0qgpMyQiIiJZK4tRnyEFQyIiIpI1NZOJiIiIxIQyQyIiIpI1XVovIiIiEhPKDImIiEjWNAK1iIiINGpqJhMRERGJCWWGREREJGtlurReREREJB6UGRIREZGsqc+QiIiISEwoMyQiIiJZi9PtOBQMiYiISNbUTCYiIiISE8oMiYiISNbiNAJ1fN6JiIiIyGpQZkhERESyVhajPkMKhkRERCRrcbqaTM1kIiIi0qgpMyQiIiJZ06X1IiIiIjGhzJCIiIhkLU59hhQMiYiISNbUTCYiIiISE8oMiYiISNbKYpRPic87EREREVkNygyJiIhI1tRnSERERCQmlBkSERGRrOnSehEREWnU1EwmIiIiEhPKDImIiEjW4tRMpsyQiIiINGrKDImIiEjW4pQZUjAkIiIi2VMHahEREZF4UGZIREREshanZjJlhkRERKRRU2ZIREREshanQRcVDImIiEjW1EwmIiIiEhPKDImIiEjWlBkSERERiQllhkRERCRrcepArcyQiIiIrDXMrJeZvWdmM83swjTzzzGzt81supk9a2Zb1LdMBUMiIiKSNcvTvzrXaVYO3Ab0BjoDg8ysc0qx/wG7uvuOwMPAdfW9FwVDIiIikrViBEPA7sBMd//I3ZcBo4C+yQXc/Tl3/yF6+jLQrr6FKhgSERGRtUVb4NOk53OiaZmcBDxV30LVgVpERESylq8O1GZ2KnBq0qTh7j58NZbzS2BXoGt9ZRUMiYiISMmIAp9Mwc9coH3S83bRtBrM7CDgYqCruy+tb50KhkRERCRrRRp0cSrQycy2IgRBA4FjatTLbBfgTqCXuy9syEIVDImIiEjWijHOkLuvMLMzgfFAOTDC3d8ysyuAae4+GrgeaAb8K6rjbHfvU9dyFQyJiIjIWsPdxwJjU6ZdmvT/g7JdpoIhERERyZruTSYiIiISEyUZDJnZpmlGlMTMOpvZpsWok4iIiKxSpEEX86IkgyHgFmCTNNM3Bm4qcF1EREQkhZnl5VEMpRoMbePuk1Mnuvt/gB2LUB8RERGJqVLtQN28jnlNClYLERERSUsdqPNvppkdkjrRzHoDHxWhPmulF//zIn0O6cdhPftw910jas1ftmwZ558zmMN69uHYo49j7tzPqufdPfxuDuvZhz6H9OPFF6YUstpSwqa88BIDDjuSfr0HMPJv99aav2zZMoacexH9eg/g+EEn8lm0Tc148y2OOeJYjjniWAYNOIbnnnmu0FWXEtTzZ115946JfHDn8ww+8je15nfYtC3PXHU/b9w8jueuHkXbjdsA0G2HvfjfTWOrH0seeY++e/YodPUlRko1M/R74EkzOwr4bzRtV2Av4LCi1WotUlVVxdVXXcOdf7uD1q1bc8zRx9Kte1c6btOxusxjjzxOixbNeXL8aJ4aO44b/3QT1//5Wj6c+SHjnhrPo2MeZuHCRZx20umMHvs45eXlRXxHUmxVVVVce9V13HbXrbRuU8mvjj6e/bvvx9Ydt64u88Sjo2neojmPP/Uo48dO4JY/38qwP13NNtt05L4H76WiooLPF33OoCOOZb9u+1FRUaqHIMm3srIybjv9Sg7+w7HM+WI+U/88mtGvPMM7n35QXeaGX1/MfRMf4b6Jj9B9x70ZdvxgfvXn3zPpzZfY5exwvrxhs5bMHD6ZCf+r1bNC8kyZoTxz9/eBHYDngS2jx/PAjtE8qceMN2fQvkN72rVvR5N1mtCrd08mTZxUo8xzEyfRp9/hABzc4yBefflV3J1JEyfRq3dP1llnHdq1a0v7Du2Z8eaMIrwLKSVvvfkW7Tu0o137tjRp0oQevXvw/MSaP0DPT3yew/oeCsCBPQ7g1Vem4u6s13S96sBn6dKlsTqIyurZvdPOzJw3i48XfMryFcsZNXkMffc4uEaZzh06MXF6yEw/N31KrfkAR+5zCE/9dxJLlv5YiGpLTJVkMGRmtwG7uvs97n5u9Bjh7traG2jhgoW0adO6+nllm9YsWLgoTZmQdq6oqKBZ82YsXryYBQsX0TqaDtC6dSULFzTo9i4SYwsXLqJ18jbVupKFqdtUUpmKigqaNWvG14u/BmDG9Bkc1fdoBvY/hiGXDlZWqJFru3EbPv18XvXzOV/Mq24GS3jj43cYsFcvAPrv1YsW6zdno+atapQZuF8fHpj8RP4rLLXoarL8ex+4wcxmmdl10U3X6mVmp5rZNDOblq6PjIgUT5cdu/DQEw9y36iR3PO3e1m6tN4bSUsjd96Iq+jaZU9eu3EsXbvswZzP51G1cmX1/DYbVrLDltsx/jU1kRWH5elReCV5aubuNwE3mdkWhDvSjjCzpsADwAOZmsrcfTgwHODHqh+8UPUtRZWtK5k/f0H184XzF9C6ctM0ZebTuk1rVqxYwXfffkerVq1oXbkpC+bPry63YMFCKltXFqzuUpoqKzdlQfI2tWAhlanbVFSmepv67jtatmpZo8xWHbdi/fWb8uEHH9K5S62xVaWRmPvFfNpvsln183Ybb8bcL+bXKDPvy4UcMew0ADZYb32O2Ls3X3//TfX8o/Y9lMdeGs+KqhWFqbTEVqlmhgBw90/c/Vp33wUYBPQD3ilytdYK23fZntmfzGbOnLksX7accU+Np2v3bjXKdOveldGPjwHg6QnPsPseu2FmdO3ejXFPjWfZsmXMmTOX2Z/MpssOXYrwLqSUdO7SmU9nf8rcOXNZvnw5E56awP7d96tRZv/u+/PkE/8G4NkJE9ltj10xM+bOmcuKFeEHa95n85j18Sds3nbzgr8HKR1TP3iDTptvxZat29OkogkD9z+c0a8+XaPMxi02rG42GfKLMxjxzEM15g/avw8PTB5dsDpLTXFqJivJzFCCmVUAvQnZoQOBScDQIlZprVFRUcGQiwfzm1N+y8qVYE6d/gAADFlJREFUK+nXvy/bdOrIbbfczvbbd6bbAd3of0Q/Lh58CYf17EOLVi247oZrANimU0d69OxB/8OPoLy8nIsuuVBXkgkVFRWcf9H5/O60s6iqWkmf/ofTcZuO/PXWO/np9j+la/f96TugD5cOuYx+vQfQomULrr7+jwC8/tob3Ht3uJrMysq48JILaLVhq3rWKHFWtbKKM/96KeMvv4/ysnJGPPMQb8/+gMuPPYdpH0xnzKvP0K3LXgw7/gLcnclvvcoZd/yh+vVbVLaj/aab8/yMl4v4LiQuzL30WpPM7GBCJuhQ4BVgFPCEu3/f0GU09mYyya3lK5cXuwoSMy0GaDB9yS0f80lB0yofffteXn5nt26+XcHTQ6WaGRoC3A+c6+5fFbsyIiIiUlOchsgo1T5DhxJuyXFldIVYqQZtIiIispYr1SBjJLAMeAE4BNgeOLuYFRIREZFVitXZOR9KNRjq7O47AJjZ3cCrRa6PiIiIxFSpBkPVvVXdfUWcok8REZE4iFOfoVINhnYys8TIWgY0jZ4b4O7eonhVExEREQVDeebuGtRGRERECqIkgyEREREpbXHqwlKql9aLiIiIFIQyQyIiIpK1OPUZUmZIREREGjVlhkRERCRrceozpGBIRP6/vbsPtqsq7zj+/TURMGOhFBUr6gQLOlgUtI6MtKBTKWLBQWk7TeoLqJ3YWqkyYwdrOzXS2mot4kspJVMRkJYXoR1hjImjwpDxDdBGCdVigIhCaynJoO3EQPDxj71Sjic3ufdcyb25e38/mTPn7LXX2ec5kzVzn/OstfeWpIk5TSZJktQTVoYkSdIsWBmSJEnqBStDkiRpYv2pC5kMSZKkWejT2WROk0mSpEGzMiRJkmbBypAkSVIvWBmSJEkT609dyGRIkiTNSn/SIafJJEnSoFkZkiRJE/PUekmSpJ4wGZIkSYNmMiRJkgbNNUOSJGli6dHZZCZDkiRpYn1KhpwmkyRJg2YyJEmSBs1kSJIkDZprhiRJ0sS86KIkSVJPmAxJkqRBc5pMkiRNzFPrJUmSesLKkCRJmoX+VIZMhiRJ0sT6kwo5TSZJkgbOypAkSZqY1xmSJEnqCStDkiRpFqwMSZIk9YKVIUmSNLH+1IVMhiRJ0qz0Jx1ymkySJA2alSFJkjQxT62XJEnqCZMhSZI0aE6TSZKkicUF1JIkSf1gZUiSJM2ClSFJkqResDIkSZIm1p+6kMmQJEmaBa8zJEmS1BNWhiRJ0ixYGZIkSeoFK0OSJGli/akLWRmSJEkDZ2VIkiTNQn9qQyZDkiRpYp5aL0mSNA+SnJTkP5JsTPL2Kfbvm+TKtv/LSZZOd0yTIUmStCAkWQScD7wMeBawPMmzxrq9AdhSVYcB5wHvne64JkOSJGmheAGwsarurKoHgSuAU8f6nApc0l5fDbwk08zpmQxJkqSJZQ/9m8YhwHdGtr/b2qbsU1XbgQeAg3Z30N4uoN5v0ZL+rOzag5KsqKpV8x3H3m6/RfMdwcLhmJqZuu7b8x3CguGY2jvtqb+zSVYAK0aaVu3p/38rQ1oxfRdpIo4pPdocUwNSVauq6vkjj9FE6B7gqSPbT2ltTNUnyWLgAOD+3X2myZAkSVoobgYOT3Jokn2AZcC1Y32uBU5vr38L+FxV1e4O2ttpMkmS1C9VtT3Jm4G1wCLgoqq6Lck5wC1VdS3wEeBjSTYCm+kSpt3KNMmSes65eD3aHFN6tDmmtKeZDEmSpEFzzZAkSRo0k6EeS1JJzh3ZfluSle31M5PckGR9km8kWdXaX5zkgdb+zSR/O0/hay+U5OE2NjYk+XiSJa19cZL7krxnrP/jklyY5I4kX2lj7pj5iV57o6nGVJLrk7x0rN9bk1zQXj8jyeok30ry1SRXJTl4fr6B+sBkqN+2AaclefwU+z4EnFdVR1fVEcCHR/atq6qjgecCpyT5lTmIVQvD1jZmjgQeBH6/tf86cDvw22NXev1HugWMh1fVLwOvA6YajxquqcbU5ey86HUZcHmS/YBPAhdU1eFV9Tzg74EnzGXQ6heToX7bDqwCzppi3y/QXbkTgKq6dbxDVW0F1rPz1T0lgHXAYe31cuCDwN3ACwGS/CJwDPBnVfUjgKq6q6o+OQ+xamHYMaauBk5up07TbrT55Lb/d4EvVtV1O95UVTdU1YY5j1a9YTLUf+cDr0pywFj7ecDnknwqyVlJfm78jUkOBA4HbpyDOLWAtAuZvQy4tf1SPwG4ju4X/fLW7ZeA9VX18PxEqYVkdExV1WbgprYNXVXoqnatmCOBr8xPlOork6Geq6rvA5cCfzTW/lHgCODjwIuBLyXZt+0+LsnX6K7iubaq/mvuItZe7rFJ1gO30FWBPgKcAlzfKonXAK9od5aWZmKqMQU/OVW2rG1Le4QXXRyGDwBfBT462lhV9wIXARcl2UD3iwu6NUOnJDmULkm6qqrWz2nE2lttbevJ/l+S5cCvJtnUmg4Cfg24DTgqySKrQ9qNncZU8wngvCTPA5ZU1Y5q0G3Ai+YsOg2ClaEBaCXnq4A37GhLclKSx7TXT6L7A3bP2PvuAt4DnD130WohSbI/cBzwtKpaWlVLgT8EllfVHXS/9t+1Y1F1kqVJTp63gLVgVNX/AtfT/WAbrQr9M3Ds6DhKcnySI5FmyWRoOM7lJ8/iORHY0KbD1gJ/vIvpsH8Ajm8LGKVxr6S778+2kbZPAC9v066/BxwMbGzVx4uB/57zKLVQXQ4cxUgy1KZjTwHObKfW/zvwJuC++QlRfeAVqCVJ0qBZGZIkSYNmMiRJkgbNZEiSJA2ayZAkSRo0kyFJkjRoJkPSApCkZvDYtBfEuHIW77s4yXen7znj461M4mmykmbMK1BLC8MLx7b/FfgasHKkbRuSpImZDEkLQFV9aXQ7yTbgf8bbx/osoruW2PY9HZ8kLWROk0k90aap3p3k7UnuAh4Enp3kjLZv6Vj/naaTkixO8idJvplkW5J7k5zb7kw/aTyHJflYkruSbE1yZ5ILkhy4i/7HJrk5yQ+TbEpy5hR9Dk3yT0nua/GtT/LKGcTyliTfaHFsSXLLTN4naRisDEn9cgZwJ/A24P+Ae+luZzBTlwEvB94LfAE4AvgLYCnwmxPG8mTgO8BbgS3A04F3AKvZedpvf+DK9rkb6e5S/qEkP6iqiwGSPBX4Mt3tPM6iu/3C7wDXJHlFVV07VRBJXkV3O5pzgHXAY4HnAD8/4feR1FMmQ1K/BDix3b+pa+jukTr9G5Pj6JKL06vq0tb8mSSbgcuSHF1V62caSFXdCNw4cvwv0CU665I8t6r+baT7zwIrquqKtr0mySF0N3m9pLr7Bq1s3+9FVXV/67e2JUnnAFMmQ3SJ19er6pyRttUz/R6S+s9pMqlf1owmQhM6iW5q7eo2XbY4yWLg023/8ZMcLMk+Sd7Rpty2Ag/RVWYAnjnW/WHgmrG2K4CnAYeMxLcaeGAsvrXAUUn230UoNwNHJ/lwkhOSLJnke0jqP5MhqV/+86d47xOBfeim1x4aeey4y/xBEx7vr+mqOZcBJwMvAE5r+8bXIG2pqofG2r7XnnckQ08EXjsW20PA+6aJ71LgD4Bj6BKnzUn+ZXwNlaThcppM6peprq/zw/a8z1j7ePJwf+t73C6Ofe+EsSwDLq2qv9zRkORxu+h7YJLHjCVEB7fne0biW0e3rmjG8bUptguBC9vi7RPp1hBdSZcgSRo4kyGp/77dno8EbofurDG6pGDUGuBs4ICq+uyj8LlL6Co3o163i76L6BZoXzHStgy4m0eSoTV0639um+1UYFVtAa5McgzwxtkcQ1L/mAxJ/XczcAfwviQ/Q3dxxjcB+452qqobklxOt2bo/cBNwI/oziT7DeDsqrp9gs9dA5ye5Fa6hdOnAcfuou8PgL9J8njgW8By4ATgjFbZAfjzFtONSf4O2AQcSJfkPb2qXj/VgZOsasf/It2U3zOA1/DIWihJA2cyJPVcVW1PcipwPnAxsBn4AN1p6u8c6/5q4Ezg9cCf0iVOm+jW2nyPyZxJd/bXu9v2arok56Yp+n6frhL0QeDZ7bPeUlWXjHyPu5M8n24d0l8BT6CbOtsAXDJ+wBGfp6tIvQY4gG467TJ2/u6SBiqP/OiSJEkaHs8mkyRJg2YyJEmSBs1kSJIkDZrJkCRJGjSTIUmSNGgmQ5IkadBMhiRJ0qCZDEmSpEEzGZIkSYP2Ywp4YZazbCjMAAAAAElFTkSuQmCC","text/plain":["<Figure size 720x576 with 2 Axes>"]},"metadata":{"needs_background":"light"},"output_type":"display_data"}],"source":["cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n","\n","fig = plt.figure(figsize=(10,8))\n","sns.heatmap(cm.T, xticklabels=list(classes_names), yticklabels=list(classes_names),\n","            cmap=\"Greens\", annot=True, fmt='.2f')\n","plt.xlabel('True labels', fontsize=16)\n","plt.ylabel('Predicted labels', fontsize=16)\n","plt.title('Confusion Matrix - Data Augmentation (known labels)', fontsize=20)\n","plt.show()"]},{"cell_type":"markdown","metadata":{"id":"agPbDU47y_UU"},"source":["Compute standard metrics"]},{"cell_type":"code","execution_count":174,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":385,"status":"ok","timestamp":1662200492657,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"yAUjTbTPy_UU","outputId":"01a1df17-4797-4536-8982-41185457d6a4"},"outputs":[{"data":{"text/plain":["{'0': {'precision': 0.9891308246941923,\n","  'recall': 0.9919775515343382,\n","  'f1-score': 0.9905521428314833,\n","  'support': 27797},\n"," '1': {'precision': 0.9629889817348222,\n","  'recall': 0.9544488419818236,\n","  'f1-score': 0.9586998932528435,\n","  'support': 27288},\n"," '2': {'precision': 0.9596442717285704,\n","  'recall': 0.9654887218045113,\n","  'f1-score': 0.962557625276414,\n","  'support': 26600},\n"," 'accuracy': 0.9708147150639652,\n"," 'macro avg': {'precision': 0.9705880260525283,\n","  'recall': 0.9706383717735577,\n","  'f1-score': 0.9706032204535803,\n","  'support': 81685},\n"," 'weighted avg': {'precision': 0.9707957457989136,\n","  'recall': 0.9708147150639652,\n","  'f1-score': 0.9707952920820585,\n","  'support': 81685}}"]},"execution_count":174,"metadata":{},"output_type":"execute_result"}],"source":["metrics = sklearn.metrics.classification_report(y_true=np.argmax(labels_test_onehot,axis=1),\n","                                                y_pred=np.argmax(pred,axis=1),\n","                                                output_dict=True)\n","metrics"]},{"cell_type":"markdown","metadata":{"id":"qDMb6LxxRTJp"},"source":["### 8.3. Test Time Data Augmentation "]},{"cell_type":"code","execution_count":177,"metadata":{"executionInfo":{"elapsed":226,"status":"ok","timestamp":1662200909304,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"K1QnE4k-UZEo"},"outputs":[],"source":["# CROPPING AND RESAMPLING -> SHIFTING + DILATATION\n","# Randomly crop the first or last part of the signal.\n","# Resample at the desired length\n","def crop_signal(signal):\n","  init_len = len(signal)\n","\n","  # Crop left & right\n","  crop_left = int(np.random.uniform(1,16))\n","  crop_right = int(np.random.uniform(1,16))\n","  crop_signal = signal[crop_left:-crop_right]\n","  # Resize\n","  crop_signal = scipy.signal.resample(crop_signal, init_len)\n","\n","  return crop_signal\n","\n","\n","def Test_Time_Data_Augmentation(signal, N_aug):\n","  \n","  # Compute mean and std for the current signal\n","  curr_mean = np.mean(signal)\n","  curr_std = np.std(signal)\n","  \n","  # Data structure to store augmented signals\n","  aug_signal = empty_list(N_aug)\n","\n","  # Generate the augmented signals\n","  for i in range(0,len(aug_signal),2):\n","    # Modify values up to 1/3 of their original value\n","    rnd1 = np.random.uniform(-curr_mean/3, curr_mean/3)\n","    rnd2 = np.random.uniform(-curr_std/3, curr_std/3)\n","    # Standardize with the new values\n","    zaug_signal = Zscore_Standardization(signal,\n","                                         curr_mean + rnd1, \n","                                         curr_std + rnd2)\n","    cropaug_signal = crop_signal(zaug_signal)\n","    # Store new values\n","    aug_signal[i] = zaug_signal\n","    aug_signal[i+1] = cropaug_signal\n","\n","  aug_signal = np.asarray(aug_signal)\n","\n","  return aug_signal"]},{"cell_type":"code","execution_count":209,"metadata":{"executionInfo":{"elapsed":234,"status":"ok","timestamp":1662204135160,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"s2xtdfVg9w-D"},"outputs":[],"source":["def TTDA(signals, features, N_aug=10):\n","  \"\"\"\n","  N.B. At Test Time we suppose we don't know the true labels of the data.\n","  Therefore, the aim of Data Augmentation is to get more robust \n","  predictions averaging the predictions on augmented versions of the same \n","  sample, rather than to solve the CLASS IMBALANCE problem.\n","  Therefore, in this case, for each sample, \n","  - we generate N augmented samples;\n","  - we predict the class for each augmented samples;\n","  - the final predicted label for the orginal sample is given by the argmax \n","    of the mean prediction score.\n","  \"\"\"\n","  # Create empty data structures\n","  predictions = np.empty(len(signals))\n","  signals_aug = []\n","  features_aug = []\n","\n","  pbar = ProgressBar()\n","  for i,sign in pbar(enumerate(signals)):\n","    # Get augmented signals for each lead\n","    # LEAD 1:\n","    curr_signal = sign[:,0]\n","    new_signals_lead1 = Test_Time_Data_Augmentation(curr_signal, N_aug)\n","\n","    # LEAD 2:\n","    curr_signal = sign[:,1]\n","    new_signals_lead2 = Test_Time_Data_Augmentation(curr_signal, N_aug)\n","\n","    # Store the augmented signals predictions in a temp object\n","    signals_temp = np.zeros((N_aug,128,2))\n","    features_temp = np.zeros((N_aug,4))\n","    for j in range(new_signals_lead1.shape[0]):\n","      # Recombine the signals\n","      new_signal = np.column_stack((new_signals_lead1[j], new_signals_lead2[j]))\n","      signals_temp[j] = new_signal\n","      features_temp[j] = features[i,:]\n","    \n","    # Add to main data structures\n","    signals_aug.append(signals_temp)\n","    features_aug.append(features_temp)\n","  \n","  signals_aug = np.asarray(signals_aug).reshape((len(signals)*N_aug,128,2))\n","  features_aug = np.asarray(features_aug).reshape((len(signals)*N_aug,4))\n","  print(\"\\n Data augmentation completed! \\n\")\n","\n","  return signals_aug, features_aug"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":25793,"status":"ok","timestamp":1662202306514,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"Rhyg1_jT8S3m","outputId":"04ccbd95-04a0-4f51-b450-b9f07a430b28"},"outputs":[],"source":["signals_aug, features_aug = TTDA(signals=signals_test, features=RRfeatures_test, N_aug=10)"]},{"cell_type":"code","execution_count":211,"metadata":{"executionInfo":{"elapsed":64282,"status":"ok","timestamp":1662204246774,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"LjbvM7Pu-yg8"},"outputs":[],"source":["pred = resNet_deep_wide_model.predict([signals_aug, features_aug.astype(\"float64\")])\n","predicted_class = np.argmax(pred, axis=-1)\n","\n","y_pred = np.zeros((predicted_class.size, predicted_class.max()+1))\n","y_pred[np.arange(predicted_class.size), predicted_class] = 1"]},{"cell_type":"markdown","metadata":{"id":"YbHtC9Ll-t2z"},"source":["Average prediction returning to the original samples"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":754,"status":"ok","timestamp":1662204247525,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"vNKXrLut-t20","outputId":"3d52360a-953a-4093-eb82-aa291a24e17b"},"outputs":[],"source":["original_idxs = np.repeat(np.arange(len(signals_test)), 10, axis=0)\n","pred_classes = Test_Time_Majority_Voting(predicted_class, original_idxs)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":4,"status":"ok","timestamp":1662204247526,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"CfGx2gxt-t20","outputId":"69ad9a6b-fdcf-4c56-b8c6-f311d98aa0bc"},"outputs":[],"source":["cm = sklearn.metrics.confusion_matrix(labels_test,pred_classes)"]},{"cell_type":"code","execution_count":216,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":523},"executionInfo":{"elapsed":520,"status":"ok","timestamp":1662204248043,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"NyGDIoku-t21","outputId":"f619db5b-e79e-4d83-83cb-dacaf4df0fe2"},"outputs":[{"data":{"image/png":"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","text/plain":["<Figure size 720x576 with 2 Axes>"]},"metadata":{"needs_background":"light"},"output_type":"display_data"}],"source":["cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n","\n","fig = plt.figure(figsize=(10,8))\n","sns.heatmap(cm.T, xticklabels=list(classes_names), yticklabels=list(classes_names),\n","            cmap=\"Greens\", annot=True, fmt='.2f')\n","plt.xlabel('True labels', fontsize=16)\n","plt.ylabel('Predicted labels', fontsize=16)\n","plt.title('Confusion Matrix - Test Time Data Augmentation', fontsize=20)\n","plt.show()"]},{"cell_type":"code","execution_count":217,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":6,"status":"ok","timestamp":1662204248044,"user":{"displayName":"Federico Carrara","userId":"04981028026339957750"},"user_tz":-120},"id":"G39fejakEPWQ","outputId":"17abea67-8952-4b6d-a757-2d8394c36261"},"outputs":[{"data":{"text/plain":["{'0.0': {'precision': 0.9997198094704399,\n","  'recall': 0.38507752635176457,\n","  'f1-score': 0.5559941824226053,\n","  'support': 27797},\n"," '1.0': {'precision': 0.08794814340588988,\n","  'recall': 0.9665787159190853,\n","  'f1-score': 0.16122643585417737,\n","  'support': 1137},\n"," '2.0': {'precision': 0.1375542583445592,\n","  'recall': 0.9673684210526315,\n","  'f1-score': 0.240859651421832,\n","  'support': 950},\n"," 'accuracy': 0.42571275598982733,\n"," 'macro avg': {'precision': 0.4084074037402963,\n","  'recall': 0.7730082211078271,\n","  'f1-score': 0.31936008989953824,\n","  'support': 29884},\n"," 'weighted avg': {'precision': 0.9376216412906454,\n","  'recall': 0.42571275598982733,\n","  'f1-score': 0.5309564119668753,\n","  'support': 29884}}"]},"execution_count":217,"metadata":{},"output_type":"execute_result"}],"source":["metrics = sklearn.metrics.classification_report(labels_test,pred_classes,\n","                                                output_dict=True)\n","metrics"]}],"metadata":{"accelerator":"GPU","colab":{"authorship_tag":"ABX9TyNMGzUISKRCNBsdzLQr9Eg/","collapsed_sections":["OqiM2sYDTHRu","-lkisEgjrlVu","ValeMADyDhzf","5w1MwzOuC8c4","NsfD8DUSSIuT","wL7J9iRydt1A"],"machine_shape":"hm","provenance":[],"toc_visible":true},"gpuClass":"standard","kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.10"}},"nbformat":4,"nbformat_minor":0}
